인간 검토자가 놓칠 수 있는 치명적인 버그를 찾아낸 AI 에이전트 구축기
요약
GitLab Orbit의 지식 그래프를 활용하여 코드베이스 전반의 의존성을 추적하고 치명적인 버그를 탐지하는 AI 에이전트 'Tripwire' 구축 사례를 소개합니다. 단순한 코드 리뷰를 넘어 다운스트림 호출자와 보안 취약점까지 분석하여 위험 보고서를 생성합니다.
핵심 포인트
- GitLab Orbit 지식 그래프를 통한 코드 간 실제 관계 매핑
- 반환 타입 변경 등 의존성 체인에 의한 논리적 오류 탐지
- 보안 취약점 검사 및 코드 소유권 기반 리뷰어 제안 기능
- 베타 플랫폼 활용 시 발생하는 API 및 트리거 제약 사항 경험
변경 사항은 무해해 보였다
팀원이 함수의 반환 타입을 변경했다. bool이 dict으로 바뀌었다.
사소한 개선처럼 보인다—응답에 더 많은 세부 정보가 담겼으니, 괜찮지 않나?
세 파일 떨어진 곳에서, 그 한 줄의 변경 사항이 조용히 결제 유효성 검사를 망가뜨렸다.
이것이 바로 내가 Tripwire를 구축하여 포착하고자 했던 정확한 시나리오이다.
Tripwire가 하는 일
Tripwire는 GitLab Orbit을 기반으로 한 GitLab Duo 에이전트와 사용자 지정 플로우다.
이는 단순히 파일 내용을 넘어, 코드베이스 전반에 걸쳐 실제 관계를 매핑하는 GitLab의 지식 그래프이다.
Tripwire를 모든 머지 리퀘스트(MR)의 검토자로 지정하면 다음 작업을 수행한다:
- 변경된 모든 함수의 실제 의존성 체인을 추적한다.
- diff에 포함되지 않은 다운스트림 호출자(downstream callers)를 찾아낸다.
- 해당 코드 경로에서 열려 있는 보안 취약점(open security findings)을 검사한다.
- 구조화된 위험 보고서를 MR에 직접 게시한다.
- 코드 소유권(code ownership)을 기반으로 누가 실제로 이를 검토해야 하는지 제안한다.
채팅 창도 없고, 프롬프트를 복사 붙여넣기 할 필요도 없다. 팀원처럼 지정하면 작동한다.
실제로 포착한 버그
나는 실제 의존성 체인을 가진 작은 테스트 코드베이스를 구축했다: notifications.py → payments.py → validation.py
그리고 validate_card()의 반환 타입을 bool에서 dict으로 변경하는 MR을 열었다. 이 MR은 깨끗해 보였다. 파일 하나만 변경되었다. 합리적으로 보이는 diff였다.
Tripwire는 이를 **치명적(CRITICAL)**이라고 플래그 지정하며, 병합하지 말라고 경고했다.
이유는 여기에 있다. Python에서 비어있지 않은 모든 dict은 참(truthy)이다—내용물이 무엇이든 상관없이. 따라서 이 코드는:
if validate_card(card_number):
process_payment(...)
...이제 항상 True로 평가된다. 유효하지 않은 카드에 대해서도 말이다. 조용히. 예외가 발생하지 않는다. 반환 타입을 명시적으로 단언(assert)하지 않는 한 테스트 실패도 없다. 그저 거절되어야 할 결제가 어쨌든 진행되는 것이다.
또한, 내가 생각조차 하지 못했던 두 번째의 작은 문제점도 포착했다: 새로운 로직이 16자리 카드만 허용한다. 아메리칸 익스프레스(American Express)(15자리)는 MR 설명에 언급조차 없이 조용히 누락되었다.
베타 플랫폼을 기반으로 구축한다는 것은 가정이 끊임없이 깨진다는 것을 의미한다
시작할 때 내가 가정했던 것의 절반은 틀린 것으로 드러났다:
merge_request:opened트리거가 (아직) 없다 — 플로우(flows)는 멘션(mention), 할당(assignment), 또는 리뷰어로 할당되었을 때 트리거된다- 커스텀 에이전트(Custom agents)는 리포지토리(repo) 파일에 정의되지 않는다 — AI Catalog UI를 통해 직접 생성된다
- Orbit의 API는 리소스 유형별로 깔끔하게 나뉜 REST 라우트(routes) 세트가 아니다 — 하나의 범용적인 그래프 쿼리(graph query) 엔드포인트(endpoint)이다
이 모든 사항은 당연해 보이는 설계가 아니라, 플랫폼이 실제로 어떻게 작동하는지에 맞춰 기존의 가정을 버리고 다시 구축해야 함을 의미했다.
시도해보기
GitLab Transcend Hackathon을 위해 구축되었으며, GitLab Orbit을 기반으로 작동합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기