배포된 스크립트/알고리즘 구현이 외부에서 쉽게 읽히지 않게 하는 것.
소스 유출과 손쉬운 디컴파일·재현을 어렵게 만든다.
대상이 아닌 것(1차):
- 브라우저 XSS 모델
- 완전한 샌드박스 OS
- “리버싱 불가능”
- 배포물에서 소스에 가까운 형태로 로직 복원
- 심볼/문자열로 알고리즘 파악
- 모듈 변조 후 재로드
- 호스트가 의도하지 않은 API 호출 (과도한 노출)
- 소스 미배포
- 심볼 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).
- 모듈 무결성 해시/서명 검증
- 개발/배포 빌드 분리(D13)
- 호스트 함수 화이트리스트(명시적 등록만)
- 난독화, 제어흐름 변환
- 암호화 로딩
- 필요 시 상용 보호 도구 연동
P2를 언어 핵심에 처음부터 넣지 않는다.
개발 중에는 디버그가 되어야 한다.
배포물에 강한 보호를 걸수록 현장 진단은 로그·버전·제한된 텔레메트리로 대체한다.
capability 아이디어는 유효하다고 본다: 네이티브 모듈이라도 호스트가 등록한 함수만 보이게 하면 된다. 다만 호스트 함수 등록은 아직 존재하지 않는다(ROADMAP Phase 2).
지금 사실인 것은 더 단순하다. 언어에 파일·네트워크 표준 API가 없다 — 넣지 않았기 때문이다. 모듈이 할 수 있는 것은 인자를 받아 값을 계산해 돌려주는 것뿐이다. 나중에 필요해지면 호스트가 주는 형태로 설계한다.
사용: “분석과 변조 비용을 높인다.”
사용 금지: “리버싱이 불가능하다.”