Hack Monty 3라운드의 20,000달러 Python 샌드박스 포상금, 2라운드 결과, 변경 사항, 참여 방법 및 규칙을 안내합니다.
탈옥하지 못하는 감옥 탈출 영화를 기억하시나요? 아니요, 저도 모릅니다. 그런 영화는 존재하지 않습니다. 탈출 없는 탈옥 드라마는 지루합니다. Hack Monty 2라운드는 매우 지루했습니다. 아무도 샌드박스를 탈출하거나 취약점을 발견하지 못했습니다(다만 몇몇 사람은 실제로 유용한 버그 보고서를 제공했습니다). 이는 실제로 포상금을 지급해야 했던 1라운드와 비교하면 극적 요소가 크게 후퇴한 것입니다.
하지만 이제 2라운드는 끝났고, 세 번째이자 마지막 라운드가 이를 대신합니다. 8월 남은 기간 동안 Hack Monty 3라운드를 진행합니다.
포상금은 최대 20,000달러이지만, 3라운드도 2라운드만큼 지루할 것으로 예상합니다. 최선을 다해 우리의 예상이 틀렸음을 증명해 보세요!
3라운드가 끝나면 안정적인 API를 갖춘 Monty V1을 공개하고, Monty가 아직 사용하기 너무 이르다는 경고를 제거할 계획입니다(이미 여러 회사가 Monty를 프로덕션에서 사용하고 있다는 이야기를 나눴습니다).
2라운드는 5월 말부터 REST 허니팟에서 진행되었습니다. 아무도 샌드박스를 탈출하지 못했고, 어느 비밀도 읽지 못했으며, 포상금도 지급되지 않았습니다.
실제로 유용한 버그 보고서는 소수 받았습니다. 충돌, 리소스 제한 경계 사례, CPython 호환성 공백 등이었으며, 그 하나하나에 감사드립니다. 하지만 샌드박스 경계를 넘은 것은 없었습니다.
Hack Monty가 처음이라면, 1라운드 사후 분석에서 48시간도 되지 않아 1라운드에서 승리한 use-after-free를 설명합니다. 그것이 여러분이 목표로 삼아야 할 기준입니다.
Monty는 5월 이후 크게 발전했습니다. CPython 호환성도 대폭 개선되었지만, 가장 큰 변화는 PR #500에서 이루어졌습니다. 이제 Monty는 서브프로세스에서 실행되므로 다음과 같습니다.
Monty를 서브프로세스에서 실행할 수 있도록 Monty에 protobuf 기반 와이어 프로토콜을 추가해야 했습니다.
하지만 와이어 프로토콜은 어떤 전송 방식 위에서 실행되는지 신경 쓰지 않습니다. 와이어 프로토콜을 갖추고 나니, WebSocket 연결을 통해 Monty를 실행하는 데에도 사용할 수 있다는 점을 깨달았고, 그래서 그렇게 했습니다. WebSocket 연결을 사용하는 외부 러너는 Monty를 로컬에서 실행하는 것보다 더 나은 보안 보호를 제공합니다. 샌드박스를 탈출해도 에이전트/애플리케이션 코드를 실행하는 머신이 아니라 Monty를 실행하는 머신만 얻게 됩니다. 또한 중앙 집중식 모니터링, 관측성, 확장도 가능하게 합니다. 모든 Monty 코드 실행을 위한 수평 확장 가능한 단일 서비스입니다. 확장과 관련해서 말하자면, Monty 워커는 작은 기본 사용량(최소 2MB)에 제한 및 선택적 타입 검사를 위한 추가 메모리만 더하므로, 단일 머신에서 수백 개를 실행할 수 있습니다.
와이어 프로토콜의 가장 강력한 부분 중 하나는 Monty 내부에서 사용할 수 있는 디렉터리를 클라이언트(에이전트 머신)에 마운트할 수 있게 한다는 점입니다.
곧 WebSocket Monty 서버를 사용하여 Logfire 내에서 Monty Python 코드를 실행할 예정입니다(Monty는 평가에 완벽한 도구입니다. 사실상 오버헤드 없이 결정론적 평가를 위해 임의 코드로 된 짧은 스크립트를 실행할 수 있기 때문입니다).
또한 비공개 소스인 WebSocket 서버에 대한 상업적 접근도 제공할 예정입니다. 관심이 있다면 문의해 주세요.
Hack Monty 3라운드에는 WebSocket 인터페이스를 사용하고 있습니다.
가장 빠른 방법은 hackmonty.py CLI입니다. 로컬 Python 파일을 샌드박스에 제출하고 전체 실행을 제어하며, 각 호스트 호출 및 이름 조회에 대해 샌드박스가 수행한 일을 출력합니다. 코드 옆에 저장하고 실행하세요. 의존성은 인라인으로 선언되어 있으므로 uv가 처음 실행할 때 가져옵니다.
uv run hackmonty.py -c '1 + 1'
uv run hackmonty.py my_attack.py
샌드박스가 요청하는 이름을 제공하려면 -g my_helpers.py를 전달하고, 타입 검사를 실행하려면 -t를, 샌드박스에 로컬 디렉터리를 마운트하려면 --mount를 사용하세요.
자체 클라이언트를 작성하고 싶다면 pydantic-monty-client를 설치하고 AsyncMontyWebsocket을 wss://hackmonty.com/에 연결하세요. 클라이언트 문서에서 전체 세션 API를 다룹니다.
더 깊이 파고들려면 protobuf 정의를 가져와 프로토콜과 세션 구현을 테스트할 자체 악성 클라이언트를 enslopify하고 싶을 수도 있습니다.
모든 세션은 추적됩니다. Logfire 프로젝트에 참여하세요. 실행되는 여러분의 시도와 다른 모든 사람의 시도를 볼 수 있습니다. 다음은 예시 추적입니다.
전체 3라운드 규칙은 pydantic.dev/monty에 있습니다. 시작하기 전에 읽어 보세요. 2라운드의 REST 시대 규칙이 모두 그대로 적용되는 것은 아닙니다.
두 가지가 새롭습니다.
한 가지 규칙은 바뀌지 않았습니다.
이런 일을 하거나 이를 시도하는 에이전트를 실행하면, 차단하고 악의적 행위자로 신고합니다.
이전과 마찬가지로, 당사의 은행도 송금할 수 있는 GitHub Sponsors 지원 지역의 은행 계좌로만 지급할 수 있습니다. 수표를 기대하며 이 일에 일주일을 쓰기 전에 전체 규칙을 확인하세요.
무언가를 찾았나요? 제출 양식을 통해 보고하세요. 먼저 Monty에 관해 이야기하고 싶나요? Pydantic Slack에 참여해 #monty에서 저희를 찾으세요. 단, 익스플로잇 세부 사항을 공개적으로 게시하지는 마세요.
즐겁게 해 보세요. 마음껏 해킹하세요.