AI로 만든 앱 48개 스캔 결과, 예상보다 훨씬 심각함
Scanned 48 vibe coded apps. Results worse than expected
핵심 요약
AI 도구로 생성된 앱 48개를 보안 스캔한 결과, 90%가 취약점을 가지고 있어 보안 상태가 매우 위험한 것으로 나타남.
- 인증 취약점 — 44%의 앱이 로그인 없이 핵심 기능에 접근 가능한 보안 허점을 가짐.
- 권한 우회 문제 — 33%의 앱이 Postgres의 SECURITY DEFINER를 오용해 행 수준 보안을 무력화함.
- 데이터 노출 위험 — 25%의 앱이 URL 조작으로 타인의 데이터를 볼 수 있는 IDOR 취약점을 포함함.
- 보안 인식 부족 — LLM은 기능 구현에만 최적화되어 있어 공격 방어 로직을 전혀 고려하지 않음.
Lovable/Bolt/Replit 같은 도구로 만든 앱들이 실제로 얼마나 안전한지 궁금해서 스캐너를 직접 만들어 이 도구들로 제작된 공개 GitHub 저장소 48개를 대상으로 테스트해 봤어.
결과는 다음과 같아:
90%가 최소 한 개 이상의 보안 취약점을 가지고 있었어.
세부 내용은 이래:
-
44%가 인증 허점을 가지고 있었어
— 로그인 없이 누구나 접근할 수 있는 API 경로나 페이지가 있었어. 예외적인 경우가 아니라 핵심 앱 기능에서 말이야. -
33%가 Security Definer RPC 함수를 사용하고 있었어
— 이게 제일 놀라웠어. AI 도구가 Postgres 함수를 생성할 때 권한 오류를 해결하려고 가끔SECURITY DEFINER를 추가하거든. 오류는 해결되지만, 행 수준 보안 정책을 모두 우회해서 슈퍼유저 권한으로 함수를 조용히 실행해 버려. 이 앱들의 3분의 1이 운영 환경에서 이걸 쓰고 있었어. -
25%가 BOLA/IDOR 취약점을 가지고 있었어
— URL의 ID만 바꾸면 남의 데이터를 볼 수 있는 고전적인 문제야. 거의 모든 AI 생성 CRUD 앱이 이래. LLM이 소유권 확인 로직 없이WHERE id = $input으로 코드를 짜기 때문이지. 부주의해서가 아니라, LLM이 학습한 패턴 자체가 그래. -
25%가 환경 설정 파일이나 설정 파일을 저장소에 그대로 커밋했어.
-
평균: 앱당 21개의 보안 발견 사항이 있었어.
심지어 "Secure-Renewals-2"라는 이름의 앱도 있었는데, 발견된 사항만 176개였어.
개발자들이 유일하게 잘한 점:
저장소에 실제 API 키를 그대로 둔 경우는 거의 없었어. .env 파일에 대한 교훈은 잘 습득한 모양이야. 하지만 나머지는? 여전히 다 뚫려 있어.
왜 이런 일이 발생할까:
LLM은 정상적인 경로(happy path)에서 잘 작동하는 코드를 생성하도록 최적화되어 있어. 보안은 적대적인 환경이라, 악의적인 사용자가 의도적으로 가정을 깨뜨리려 할 때 무슨 일이 벌어질지 고민해야 해. 모델들은 그런 모드로 훈련되지 않았어. 모델은 작동하는 코드를 쓰지, 공격에서 살아남는 코드를 쓰지는 않거든.
인증 문제가 좋은 예야. AI 도구들은 전체 로그인 흐름, 등록, 세션, 비밀번호 재설정 기능은 잘 만들어. 하지만 로그인 뒤에 경로를 실제로 보호하는 단계는 자주 건너뛰어. 문은 있는데 잠금장치가 없는 셈이지.
가장 놀라웠던 점:
Security Definer 문제는 눈에 보이지 않아. 오류도, 경고도, 뭔가 잘못됐다는 신호도 없어. 앱은 완벽하게 작동하거든. 하지만 모든 사용자가 그 함수를 호출해서 마치 슈퍼유저인 것처럼 테이블의 모든 행에 접근할 수 있어. 보안 감사를 받거나 해킹을 당한 뒤에야 알게 될 거야.



