Noma Labs의 연구원들은 GitHub의 새로 출시된 Agentic Workflows가 속임수에 넘어가 비공개 저장소의 파일을 게시할 수 있음을 보여주었습니다. 이는 단 하나의 공개 이슈 댓글만으로도 내부 AI 어시스턴트를 데이터 유출 통로로 만들 수 있음을 시사합니다.
이 결함이 중요한 이유는 특별한 익스플로잇 코드 없이도 GitHub의 내장된 안전 점검을 우회할 수 있기 때문입니다. 공격자는 AI 에이전트가 읽고 실행할 법한, 겉보기에는 무해해 보이는 이슈를 작성하기만 하면 됩니다.
취약점 작동 방식
Agentic Workflows를 사용하면 AI 에이전트가 워크플로 파일에 정의된 명령을 실행함으로써 새로운 이슈와 같은 GitHub 이벤트에 응답할 수 있습니다. Noma Labs는 에이전트가 정당한 워크플로 지침과 사용자가 제출한 댓글에 포함된 텍스트를 구분하지 못한다는 사실을 발견했습니다. 공격자는 관리자의 요청을 모방한 공개 이슈를 게시하고 그 뒤에 숨겨진 지시 사항을 덧붙임으로써 에이전트가 다음과 같은 동작을 하도록 유도할 수 있습니다.
- 이슈를 엽니다 (공개적으로 보임).
- 평범해 보이지만 은밀한 명령을 포함한 한 줄을 포함합니다.
- 워크플로가 읽기 권한을 가진 비공개 저장소에서 파일을 가져오도록 AI를 트리거합니다.
- 에이전트가 가져온 콘텐츠를 동일한 이슈의 답글로 게시하게 합니다.
연구원들은 숨겨진 명령 앞에 “Additionally,”라는 단어 하나만 삽입해도 GitHub의 가드레일을 통과하기에 충분하다는 것을 발견했습니다. 추가적인 권한, 토큰 또는 커스텀 코드는 필요하지 않으며, 단지 적절한 문구만 있으면 됩니다.
이것이 단순한 버그 그 이상인 이유
이 문제는 구조적입니다. AI 에이전트는 저장소 이벤트로부터 받는 모든 텍스트를 신뢰할 수 있는 것으로 취급하며, 이는 사실상 사용자 생성 콘텐츠를 웹 애플리케이션의 SQL injection과 유사한 입력 벡터로 만드는 것과 같습니다. 만약 워크플로가 에이전트에게 비공개 저장소에 대한 읽기 권한과 공개 댓글 작성 권한을 동시에 부여한다면, 이 두 가지가 결합되어 데이터 유출을 위한 직접적인 경로가 생성됩니다.
GitHub의 입장
GitHub에 이 결함이 통지되었습니다.
팀을 위한 완화 조치
- 에이전트 권한 제한: 비공개 저장소에 대한 읽기/쓰기 권한은 반드시 필요한 경우에만 부여하십시오.
- 공개 게시 차단: 에이전트가 공개 이슈에 댓글이나 기타 결과물을 게시할 수 없도록 워크플로를 구성하십시오.
- 모든 외부 입력을 신뢰할 수 없는 것으로 취급: 사용자 생성 텍스트가 AI에 도달하기 전에 이를 정제(sanitize)하거나 무시하는 검증 레이어를 추가하십시오.
- 워크플로 트리거 감사: 어떤 이벤트(이슈, pull requests 등)가 에이전트를 호출하는지 검토하고, 관련 권한이 의도된 사용 사례와 일치하는지 확인하십시오.
핵심 요약: 비공개 코드를 읽고 공개적으로 게시할 수 있는 AI 어시스턴트는 설정한 경계만큼만 안전합니다. 엄격한 권한 제한과 입력값 정제 없이는, 단 하나의 공개 댓글이 생산성 도구를 데이터 유출 통로로 바꿀 수 있습니다.
