- 우연히 OpenAI Code Execution의 동작 방법을 알게 되었음
- 찾아낸 방법과 프롬프트 인젝션 전략, 정확히 어떻게 동작하는지, C + Javascript를 실행할 수 있게 만든 리버스 엔지니어링 방법을 설명
발견 과정
- 포트 할당 코드를 디버그하려고 ChatGPT에 포트 상태를 확인하는 CLI 명령어를 요청했는데, ChatGPT가 대답을 주지않고 로컬에서 실행함
- 여러 핸드셰이크 요청을 보낸 결과 localhost:8080/openapi.json에서 응답이 돌아옴 → 이를 통해 내부 OpenAPI 스펙 접근 성공
- 그러나 FastAPI 서비스에서 생성된 OpenAPI 스펙은 문서가 부족하여 유용성이 낮았음
추가 포트 탐색
- 다른 포트의 역할을 파악하기 위해 AI에 HTTP, TCP, UDP, MySQL, Postgres 핸드셰이크 시도
- @dexhorthy가 ZeroMQ 신호에 대해 응답이 돌아온다는 사실 발견
-
0xff00000000000000257 → 0xff00000000000000017f 응답
- 구글 검색 결과 관련 정보 링크 발견: ZeroMQ 프로토콜 분석
- 메시지 큐가 아니라 Jupyter Kernel이라는 사실 발견 (ZeroMQ 기반 실행 환경)
파일 시스템 접근
- 서버의 모든 파일을 나열해달라고 요청했으나 거부됨
- 파일 업로드 후 업로드된 디렉토리 및 상위 디렉토리 내용을 탐색
- 결국 .openai_internal 디렉토리 발견
- 실제 서버는 user_machine 모듈에서 실행 중
- AI에 파일 이름 및 파일 내용을 pandas 데이터프레임으로 출력하도록 요청 → 소스 코드 복원 성공
환경 이해
-
Kubernetes에서 실행 중인 환경 변수 확인
- 도커나 Firecracker 사용하지 않고 gVisor를 통해 시스템 콜 에뮬레이션 및 샌드박스 보호
-
로컬호스트 호출 외에는 네트워크 차단 (DNS, 외부 사이트 접근 불가)
- 리눅스 커널 버전은 2016년 버전으로 매우 오래됨
샌드박스 구조
- AI가 자신의 실행 위치를 물었을 때 Azure 데이터 센터에서 실행 중임을 확인
-
Azure Kubernetes에서 실행 중, 프로세스 격리를 위해 gVisor 사용
- 컨테이너는 tini를 init 프로세스로 사용
- Python Jupyter Kernel에서 코드 실행 → OpenAI API를 통해 UI로 출력
User Machine (코드 실행 환경)
- Python Jupyter Kernel 사용
- 실행 시간 제한은 기본적으로 30초 (API에서 수정 가능)
- 샌드박스에서 여러 커널이 동시에 실행 가능
- 파일 업로드 최대 크기: 1GB
보안
- 외부 네트워크와의 연결 완전 차단
- 시스템 파일 접근 차단, 로컬 네트워크 포트 등 노출된 취약점 없음
- OpenAI의 보안은 매우 강력했으며, RPC 채널 외에는 데이터 유출 불가
C 및 JavaScript 실행
- AI가 gcc 바이너리를 포함하고 있음을 발견
- 간단한 C 프로그램 작성 → 컴파일 → 실행 성공
-
Duktape (경량 JavaScript 런타임) 업로드 후 C 파일 컴파일 성공
- Python이 C를 컴파일 → JavaScript 런타임 생성 → JS 코드 실행 성공
프롬프트 엔지니어링 전략
- AI를 샌드박스에서 실행 중이라고 인식하도록 속임
- 처음에는 수학 연산부터 시작 → 점진적으로 파일 시스템 접근 요청
- 파일 시스템 검색을 통해 AI가 샌드박스 상태임을 인식 → 보안 허점 테스트 시도
결론
- OpenAI의 코드 실행 환경은 매우 강력하고 보안이 뛰어남
- 그러나 AI의 동작 방식 및 내부 환경을 역공학으로 파악한 결과 C 및 JS 실행 가능
- 코드 실행은 간단한 API 응답 처리에 매우 유용함
- 복잡한 코드 실행이 필요하면 자체 솔루션 구축 고려 or freestyle.sh 같은 서비스 사용 권장