Skip to content

Security: xzawed/Mathless

Security

docs/SECURITY.md

SECURITY

보호 대상

배포된 스크립트/알고리즘 구현이 외부에서 쉽게 읽히지 않게 하는 것.
소스 유출과 손쉬운 디컴파일·재현을 어렵게 만든다.

대상이 아닌 것(1차):

  • 브라우저 XSS 모델
  • 완전한 샌드박스 OS
  • “리버싱 불가능”

위협 (우선)

  1. 배포물에서 소스에 가까운 형태로 로직 복원
  2. 심볼/문자열로 알고리즘 파악
  3. 모듈 변조 후 재로드
  4. 호스트가 의도하지 않은 API 호출 (과도한 노출)

단계

P0 — MVP

  • 소스 미배포
  • 심볼 strip
  • 최소 export만 남김
  • ABI 버전 심볼 + 인터페이스 지문 노출. 참조 호스트는 둘 다 로드 시점에 검사하고 거부한다(실측, 아래 표). 서드파티 호스트에 대해서는 계약이다

P0 실측 프록시 (2026-08-29, 수용 C). 아래는 프록시 수치일 뿐이며 "리버싱 난이도"로 환산하지 않는다(D05, 규칙 6). 측정 대상은 discount.dll:

프록시 값
export 심볼 집합 정확히 3개 — mlx_discount + ml_module_abi_version + ml_iface_hash_<모듈>. 자체 PE 리더로 파싱하고, dumpbin /exports와 교차 확인(2026-08-29) — 더 이상 우리 구현 하나에만 의존하지 않는다. (2026-09-02 갱신: 인터페이스 지문 슬라이스가 예약 심볼 하나를 더했다 — 2개에서 3개로 늘었고, 그 대가로 드리프트 거부가 실측된다. 수치를 조용히 두지 않는다.) (2026-09-12 갱신: 지문 심볼에 모듈 이름이 붙었다 — 개수와 크기는 무변경, 실측 3개 · 9,728 B.)
산출물 크기 약 9.0~9.5 KB (no_std+strip+lto+opt-z; std 기본 빌드 ~107,008 B 대비 ~11×↓). 정확한 바이트 수는 머신에 따라 다르다(2026-09-03 실측): 같은 커밋·같은 핀된 rustc 1.97.1이 개발 머신에서 9,728 B, GitHub windows-latest에서 9,216 B를 냈다 — FileAlignment 한 블록(512 B) 차이이며, 핀은 rustc를 덮지 MSVC link.exe·Windows SDK를 덮지 않는다. 그래서 한 값을 프로젝트 상수처럼 적지 않는다. 가드는 protection.rs의 범위 assert이고, doc_claims.rs가 이 문단이 두 측정값을 모두 담고 있는지 확인한다
산출물 내 소스 없음 — 소스 코멘트·원본 파일명 비유출
ABI 버전 심볼 모듈이 ml_module_abi_version을 export하고, 오라클이 이를 조회해 컴파일러 상수와 일치함을 assert한다. 참조 C 호스트는 로드하는 모듈 전부에 대해 버전을 비교하고 불일치 시 거부한다(2026-09-02, 그전에는 당시 13개 중 2개만 비교했다 — Grok 검토가 잡아냈고 코드로 재확인. 개수는 host.c가 정본이다). 서드파티 호스트에 대해서는 여전히 계약이다.
인터페이스 지문 모듈이 ml_iface_hash_<모듈>()을 export하고 생성 .h가 ML_<MODULE>_IFACE_HASH를 박는다. 드리프트 거부를 실측했다: 파라미터를 맞바꾼 pack_drift.dll은 심볼이 그대로 해석되고 ABI 버전도 같지만 게이트가 거부한다(수용 D 출력). ⚠ 이것은 무결성(P1)이 아니다 — 공격자는 지문 함수도 고친다. 막는 것은 호스트를 다시 빌드하지 않고 모듈을 바꾼 실수다

⏳ 미구현: 아래 P1·P2의 항목 전부 — 목록은 그 두 절이 정본이다. 검사하지 않는 서드파티 호스트는 위 두 게이트의 보호를 받지 못한다 — 참조 호스트에서만 강제된다 (SPEC-iface-hash.md §5.1).

P1

  • 모듈 무결성 해시/서명 검증
  • 개발/배포 빌드 분리(D13)
  • 호스트 함수 화이트리스트(명시적 등록만)

P2

  • 난독화, 제어흐름 변환
  • 암호화 로딩
  • 필요 시 상용 보호 도구 연동

P2를 언어 핵심에 처음부터 넣지 않는다.

보안과 DX

개발 중에는 디버그가 되어야 한다.
배포물에 강한 보호를 걸수록 현장 진단은 로그·버전·제한된 텔레메트리로 대체한다.

능력 모델 — ⏳ 계획, 미구현

capability 아이디어는 유효하다고 본다: 네이티브 모듈이라도 호스트가 등록한 함수만 보이게 하면 된다. 다만 호스트 함수 등록은 아직 존재하지 않는다(ROADMAP Phase 2).

지금 사실인 것은 더 단순하다. 언어에 파일·네트워크 표준 API가 없다 — 넣지 않았기 때문이다. 모듈이 할 수 있는 것은 인자를 받아 값을 계산해 돌려주는 것뿐이다. 나중에 필요해지면 호스트가 주는 형태로 설계한다.

대외 표현

사용: “분석과 변조 비용을 높인다.”
사용 금지: “리버싱이 불가능하다.”

There aren't any published security advisories