버그 바운티는 채택된 리포트당 돈을 준다. 잠깐 이 문장에 머물러 보자. 나머지가 전부 여기서 따라 나오니까. 당신은 소프트웨어를 더 안전하게 만든 대가로 돈을 받는 게 아니다 — 그건 측정할 수 없고 아무도 측정하려 하지 않는다. 당신은 트리아지 담당자가 “유효”라고 표시하는 산출물을 만든 대가로 돈을 받는다. 이 경제 전체가 셀 수 있는 것을 최적화하는데, 셀 수 있는 것은 채택된 리포트지 줄어든 위험이 아니다. 이 둘은 함께 움직이기로 되어 있다. 오랫동안 대체로 그랬다. 그러다 사람들이 그 틈을 알아챘고, 그 안에 살기 시작했다.
버그 바운티가 사기라고 생각하진 않는다. 그렇지 않았다면 프로덕션에서 썩었을 진짜 취약점을 끌어냈고, 받을 자격 있는 연구자에게 돈을 흘려보냈다. 하지만 인센티브는 처음부터 휘어 있었고, 그 휘어짐은 물량이 적고 리포트가 대체로 정직할 때는 보이지 않았다. 물량을 키우면 — 지난 2년이 정확히 그랬다 — 그 휘어짐이 이 물건의 전체 모양이 된다.
이 모델이 실제로 보상하는 것
심각도부터 보자. 보상표는 크리티컬에 로우보다 많이 준다. 합리적이다, 리포터가 심각도를 제안하고 높게 부르는 데 페널티가 없다는 걸 알아채기 전까지는. 그래서 부풀린 제출이 나온다: 정보 유출이 원격 코드 실행으로 분장하고, self-XSS가 계정 탈취로 서술되고, 심각도 폼의 모든 드롭다운이 가장 위협적인 선택지로 클릭된다. 리포터가 꼭 거짓말하는 건 아니다. 낙관에 보상하고 결코 벌하지 않는 점수 함수에 올바르게 반응하는 것이다. 트리아지 담당자는 하루를 심각도 깎는 데 쓰는데, 이건 모델이 그들에게 조용히 떠넘긴 무급 노동이다.
다음은 경주다. 대부분의 프로그램은 버그의 첫 유효 리포트에 돈을 주고 나머지는 중복으로, 대개 무보수로 표시한다. 선착순은 공정하게 들리지만 무엇을 선별하는지 보라: 철저함이 아니라 속도다. 2등이 무보수라면, 올바른 수는 뭔가 냄새를 맡는 즉시 — 실제로 확인하기도 전에 — 얇은 리포트를 쏘는 것이다. 2등으로 도착한 확증 리포트는 0원이고, 1등으로 도착한 설익은 리포트는 바운티만큼의 값이니까. 구조가 버그를 이해하기 전에 제출하는 것을 보상한다. 그러면 메인테이너는 한 아침에 거의 같은 리포트 네 개를 받고, 그중 셋을 읽고 판단해 중복으로 닫아야 한다 — 역시 무보수로.
그리고 맨 밑에는 beg bounty가 있다. 찾을 수 있는 모든 프로그램에 자동 스캐너 출력을 뿌려라 — 빠진 보안 헤더, SPF ~all 소프트페일, 스테이징 박스의 자체 서명 인증서 — 그리고 취약점도 새 소식도 아닌 “발견”에 돈을 요구하라. 준비 안 된 회사에 충분히 자주 통해서 대규모로 할 만하다. 오로지 보상이 목적이고 보안은 부차적이라 존재하는 행위다.
이 중 어느 것도 나쁜 사람을 필요로 하지 않는다. 점수판이 보상하는 것에 반응하는 평범한 사람이면 된다. 그게 바로 뒤틀린 인센티브다: 시스템이 원하는 것의 대리 지표에 돈을 주다가, 모두가 대리 지표를 최적화하고 정작 원하는 것을 버리는 것.
AI는 문제를 만들지 않았다 — 마찰을 없앴다
수년간 뒤틀린 인센티브는 우연한 제동장치 하나로 억제됐다: 설득력 있는 버그 리포트를 쓰는 데 노력이 들었다. 코드를 읽고, 개념 증명을 만들고, 그럴듯한 서사를 엮어야 했다. 그 비용이 대부분의 소음을 걸러냈다. 그건 보안 통제가 아니라 마찰이었고, 마찰은 아무도 눈치채지 못한 하중 지지 일을 하고 있었다.
거대 언어 모델이 그 마찰을 없앴다. 이제 유창하고 기술적으로 들리며 완전히 허구인 취약점 리포트를 몇 초 만에 생성할 수 있다 — CVSS 점수, 가짜 개념 증명, 존재하지 않는 함수에 대한 자신만만한 언급까지 딸려서. 전문가가 자세히 읽기 전까지는 정확히 진짜 리포트처럼 읽힌다. 그럴듯한 산출물을 만드는 비용이 거의 0으로 떨어졌고, 산출물을 만들 인센티브는 늘 거기 있었다. 결과를 예측해 보라.
curl 프로젝트가 사례 연구다. Daniel Stenberg가 감(感)이 아니라 숫자로 공개 기록했기 때문이다. 6년에 걸쳐 curl의 버그 바운티는 약 8만 6천 달러를 지급하고 78개의 진짜 취약점을 고쳤다 — 진짜 일을 하는 진짜 프로그램이었다. 대부분의 기간 동안 제출의 15% 넘게가 확증된 버그가 됐다. 그러다 2025년 확증률이 5% 밑으로 붕괴했다: 제출 스무 개 중 하나도 진짜가 아니었고, 나머지는 사람이 여전히 읽어야 하는 AI 생성 슬롭이었다. 보안 리포트는 훑어서 트리아지할 수 없으니까. 2026년 1월, 이 홍수가 가치를 만드는 속도보다 메인테이너 시간을 잡아먹는 속도가 빠르다고 결론 내린 뒤, curl은 프로그램을 닫고 연구자에게 GitHub로 신고하라고 요청했다.
이걸 잘 읽어야 한다. 순진한 교훈은 “AI가 버그 바운티를 망쳤다”이고, 진짜 교훈은 더 날카롭다. AI는 저가치 리포트를 보상에 뿌릴 인센티브를 발명하지 않았다. 그 인센티브는 첫날부터 “채택된 리포트당 지급”에 박혀 있었다. AI는 그저 그걸 실행하는 걸 공짜로 만들었다. 슬롭은 제동장치가 끊긴 채 마침내 전속력으로 돌아가는 뒤틀린 인센티브였다.
실제로 값을 치르는 사람
비용을 따라가 보자. 자금이 넉넉한 기업의 경우, 버그 바운티는 트리아지 팀의 급여다 — 비싸지만 회사가 선택했고 감당할 수 있다. 박살 나는 건 오픈소스 메인테이너다. 대개 자원봉사자이고, 예산은 없이 트리아지 부담을 전부 진다.
소프트웨어를 쓰는 사람이라면 — 당신은 쓴다 — 여기가 신경 쓰여야 할 부분이다. 보안 리포트는 무시할 수 없다. 엉뚱한 걸 무시했다가는 진짜 취약점을 깔고 앉은 메인테이너가 된다. 그래서 모든 리포트 — 자신만만하고 유창하며 완전히 날조된 것까지 — 가 무급이고 스팸 필터가 되겠다고 서명한 적 없는 사람의 신중한 정독을 요구한다. 바운티 모델에 0비용 생성이 더해지자 “책임 있는 공개”가 소프트웨어 공급망을 떠받치는 바로 그 사람들에 대한 무급 서비스 거부 공격으로 바뀌었다. Stenberg는 이를 슬롭이 오픈소스를 DDoS한다고 불렀고, 그 표현은 정확하다.
암울한 아이러니는 정직하고 신중하게 일하는 연구자가 가장 크게 다친다는 것이다. 그들의 신호는 이제 유창한 소음의 눈사태에 묻히고, 진짜 리포트는 더 깊은 대기열에서 더 오래 기다리고, 도우려던 메인테이너는 번아웃되거나 프로그램을 닫는다 — 나쁜 신고자를 막으려고 좋은 신고자에게 문을 닫으면서. 인센티브는 보안을 만들어내지 못했을 뿐 아니라, 잘 돌아가던 공개 채널을 능동적으로 망가뜨리고 있다.
실제로 정렬되는 것
문제가 대리 지표에 돈을 주는 것이라면, 해법은 대리 지표에 보상하기를 멈추고 소음에 비용을 물리는 것이다.
효과 있는 개입은 모두 나쁜 리포트의 비용을 올리거나 보상을 낮춘다. 새 계정이 더 엄격한 심사를 받고 슬롭 이력이 접근권을 깎는 평판 게이트는 AI가 없앤 마찰을 되돌려 놓는다. 경솔한 리포트가 발신자에게 무언가를 치르게 하는 보증금·스테이크 모델은 뿌리기의 경제를 뒤집는다. 중복이라도 독립적으로 유효하면 지급하는 것은 빠르고 얇게 제출하려는 뒤틀린 압력을 없앤다. 그리고 범위를 좁히는 것 — “우리는 스캐너 출력이 아니라 이 컴포넌트들의 악용 가능한 취약점에 돈을 준다” — 은 정의 단계에서 beg bounty를 죽인다.
하지만 정직하고 불편한 답은, 어떤 프로젝트는 바운티를 아예 운영하지 말아야 한다는 것이다. 바운티는 당신의 트리아지 역량을 겨눈 제출의 소방 호스이고, 당신이 자원봉사자 셋이라면 그 호스는 당신을 겨눈 무기다. 그냥 하는 협조적 공개 — 보안 정책, 연락처, 미끼로 매달린 현금 보상 없음 — 는 물량이 적고 비율이 훨씬 낫다. 인력이 부족한 프로젝트에는 그게 전부다. curl은 보안 리포트를 안 받게 된 게 아니다. 리포트당 지급을 멈췄고, 그럼으로써 슬롭이 먹고 살던 인센티브를 없앴다.
교훈은 버그 바운티가 나쁘다는 게 아니다. 게임당한 모든 지표와 같은 교훈이다: 지표가 대신하던 것 대신 숫자에 돈을 주는 순간, 언젠가 누군가 그 숫자를 바닥까지 최적화하리라 가정해야 한다. 버그 바운티는 채택된 리포트에 돈을 주고 그게 보안이길 바랐다. 한동안, 길에 마찰이 충분할 때는 그 희망이 버텼다. 이제 마찰은 사라졌고, 우리는 그 인센티브가 내내 실제로 무엇을 사고 있었는지 알게 된다.