출처
- source_url: https://x.com/chenchengpro/status/2050051524580303178
- author: chenchengpro
- published: 2026-05-01
- raw: raw source:
web-2026-05-02-post-by-chenchengpro-on-x
요약
X 사용자 chenchengpro가 소개한 Codex++(github.com/b-nnett/codex-plusplus)는 OpenAI Codex 데스크톱 애플리케이션에 플러그인 시스템을 주입하는 프로젝트다. Codex는 확장 메커니즘이 전혀 없는 폐쇄형·코드서명된 Electron 앱이기 때문에, 이 프로젝트는 코드를 주입하기 위해 4단계 방어를 순차적으로 돌파해야 했다고 설명한다.
첫째, asar 패키지 수정 단계에서는 @electron/asar로 app.asar를 압축 해제한 뒤 package.json의 main 필드를 원래 진입점 대신 자체 loader.cjs로 바꾸되, 원본 asar의 unpacked 파일 목록을 정확히 유지해야 한다(그렇지 않으면 Electron 모듈 로딩이 MODULE_NOT_FOUND 오류를 낸다). 재압축은 임시 파일에 먼저 쓴 뒤 이름을 바꾸는 원자적 방식으로 처리해 쓰기 중단으로 인한 앱 손상을 방지한다. 둘째, 무결성 검사 우회 단계에서는 Electron이 asar 헤더(전체 파일이 아닌 헤더 JSON)의 SHA-256을 Info.plist의 ElectronAsarIntegrity에 저장해 검증하므로, asar 수정 후 이 해시를 동기적으로 갱신해야 한다. 셋째, 퓨즈(fuse) 비활성화 단계에서는 Framework 바이너리 내 특정 시그니처 문자열(“dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX”)로 위치를 찾은 뒤, 버전+개수 헤더를 지나 각 퓨즈(1바이트, ASCII ‘0’/‘1’)를 찾아 EnableEmbeddedAsarIntegrityValidation을 ‘1’에서 ‘0’으로 직접 변경한다. 넷째, 이 모든 조작으로 원본 Developer ID 서명이 깨지므로 codesign --force --deep --sign -으로 애드혹 재서명해 macOS가 앱 실행을 막지 않도록 한다.
주입되는 loader.cjs는 단 70줄로, “플러그인 시스템이 죽더라도 Codex 자체를 절대 다운시켜서는 안 된다”는 설계 원칙을 따른다. 모든 로직이 safe()로 감싸져 예외는 loader.log에만 기록되고, 마지막 줄은 항상 require("./" + originalMain)으로 무조건 Codex의 원래 진입점에 제어권을 돌려준다. 런타임 계층도 흥미로운데, Codex 내부의 최소화·난독화된 window services 객체에 접근하기 위해 buildFlavor: 같은 팩토리 함수 호출을 검색하고, 호출 본문에 allowDevtools:, preloadPath:, globalState: 등 최소 5개 알려진 속성명이 있는지 확인하는 지문(fingerprint) 매칭 방식을 쓴다. 일치하면 할당된 변수명을 역추적해 globalThis.codexpp_window_services = 를 문장 끝에 주입하는, JS AST 수준의 완전한 소스 패치를 수행한다.
가장 정교한 부분은 Sparkle 자동 업데이트 호환성 처리다. Sparkle은 업데이트에 유효한 Developer ID 서명을 요구하지만 패치된 앱은 애드혹 서명만 갖고 있다. 해결책은 Node의 Module._load를 후킹해 Sparkle의 installUpdatesIfAvailable 메서드를 가로채고, 업데이트 전에는 ditto로 백업해둔 원본 서명 앱을 복사해 Sparkle이 정상 작동하도록 하며, 업데이트 후에는 launchd가 app.asar 변경을 감지해 codexplusplus repair --quiet을 자동으로 재실행하는 방식이다. 사용자 개입 없이 완전 자동화된 구조다. 글쓴이는 이를 “단순 몽키패치가 아니라 바이너리 퓨즈부터 JS 소스 패치, Sparkle 후킹까지 이어지는 완전한 엔지니어링 시스템”이라고 평가했다. 댓글에서는 이 접근이 OpenAI의 사소한 내부 리팩터링만으로도 무력화될 수 있는 “짧은 반감기”를 가진 취약한 구조라는 지적과, 폐쇄적 생태계를 강제로 여는 구조적 저항이라는 긍정적 평가가 함께 달렸다.
관련 위키
원문 보존 위치
원문 전체는 raw source: web-2026-05-02-post-by-chenchengpro-on-x에 source_url과 함께 저장되어 있다.