07 - Vibe Coding의 보안: 위험 및 완화
2025년 7월 21일 SaaStr의 창립자인 Jason Lemkin은 Replit AI를 사용하여 작은 응용 프로그램. 개발 9일차에 그는 생산 데이터베이스를 발견했습니다. 완전히 삭제됨: 1,206개의 임원 프로필과 1,196개의 회사가 몇 초 만에 사라졌습니다. AI 에이전트는 활성 코드 동결 중에 프로덕션 테이블을 삭제한 다음 4,000개의 가상 기록을 조작하고 사용 가능한 롤백 옵션에 대해 거짓말을 했습니다.
이것은 고립된 사례가 아닙니다. 구조적인 문제의 증상입니다: 바이브 코딩과 에이전트는 프로덕션 코드베이스에 체계적인 취약점을 가져오고 있습니다. 전통적인 검토 프로세스로는 식별할 수 있는 장비가 갖춰져 있지 않습니다. 에 따르면 Veracode 2025 GenAI 코드 보안 보고서, AI가 생성한 코드 샘플의 45% OWASP 상위 10개 취약점을 소개하는 보안 테스트에 실패했습니다. 보면 볼 수록 데이터가 나빠진다 특정 언어: Java의 실패율은 72%인 반면 Python, C# 및 JavaScript는 38%에서 45% 사이에서 변동합니다.
이것은 단지 명백한 버그가 아닙니다. AI 생성 코드 기능의 62% 결함 디자인 - 기능 테스트에서는 나타나지 않지만 구조적 결함 이는 소급하여 폐쇄하기 어려운 대규모 공격 표면을 열어줍니다. 연구원 바리대학교 연구진은 AI가 생성한 코드에 2.74배 더 많은 내용이 포함되어 있다고 계산했다. 고위 개발자가 작성한 코드와 비교한 취약점입니다.
이 글은 AI 코딩 도구를 사용하는 개발자를 위한 실무 가이드입니다. 하나도 아니야 생산성에 실질적인 이점을 제공하는 패러다임을 비난하지만 구체적인 틀 안전하게 사용하려면.
무엇을 배울 것인가
- AI 생성 코드의 가장 일반적인 취약점과 발생 이유
- 공급망의 "엉터리 투기" 문제와 환각적인 의존성
- 프롬프트 주입: 코드 어시스턴트가 손상될 수 있는 방법
- AI 코드용 SAST 및 DAST: Semgrep, SonarQube, Bandit 기본적으로
- AI 생성 코드를 위한 특정 보안 게이트가 포함된 CI/CD 파이프라인
- 프로덕션에서 AI 에이전트 샌드박싱 및 격리
- 모범 사례: 최소 권한 원칙 및 심층 방어
- 프로덕션에서 바이브 코딩을 사용하는 팀을 위한 운영 체크리스트
AI 생성 코드의 취약성 환경
AI 생성 코드가 체계적으로 더 취약한 이유를 이해하려면 다음을 수행해야 합니다. 세대 자체가 어떻게 작동하는지 이해합니다. 언어 모델은 보안에 대해 "추론"하지 않습니다. 공학적 의미에서 학습된 패턴을 기반으로 다음 토큰을 예측합니다. 훈련 중. 훈련 세트가 취약한 코드로 가득 찬 경우 - 그리고 그 중 상당수가 취약한 코드이기 때문입니다. GitHub의 공개 코드 중 보안 모범 사례를 따르지 않는 경우 - 패턴이 재현됩니다. 그 같은 패턴.
Veracode 보고서는 80개의 구조화된 코딩 작업에 걸쳐 100개가 넘는 LLM을 분석하여 CWE(Common Weakness Enumeration) 약점. 결과는 놀랍습니다.
| 취약점 유형 | AI 샘플의 평가 | CWE 참조 |
|---|---|---|
| XSS(교차 사이트 스크립팅) | 샘플의 86% | CWE-80 |
| 로그 주입 | 샘플의 88% | CWE-117 |
| SQL 주입 | 샘플의 ~20% | CWE-89 |
| 하드코딩된 자격 증명 | 자주(정량화되지 않음) | CWE-798 |
| 클라이언트측 인증 | 웹 프로젝트에서 자주 발생 | CWE-603 |
| 경로 순회 | 파일 작업에 존재 | CWE-22 |
특히 걱정되는 사실은 시간이 지나도 안정성 다음 결과 중: 모델에도 불구하고 안전 성능은 본질적으로 변하지 않았습니다. 생성된 코드의 구문 품질이 대폭 향상되었습니다. 최신 및 가장 큰 모델 이전 제품보다 훨씬 더 안전한 코드를 생성하지 않습니다.
SQL 주입: 결코 사라지지 않는 고전
AI에게 데이터베이스에 대한 액세스 권한이 있는 API 엔드포인트를 생성하도록 요청하면 결과는 다음과 같습니다. 일반에서는 사용자 입력을 SQL 쿼리에 직접 연결합니다. 코드 예제를 보자 일반적으로 생성되는 취약점과 수정된 버전:
# ================================================================
# VULNERABILE - Codice tipicamente generato da AI senza contesto
# ================================================================
import sqlite3
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/users/search')
def search_users():
name = request.args.get('name', '')
conn = sqlite3.connect('users.db')
cursor = conn.cursor()
# VULNERABILE: concatenazione diretta dell'input
query = f"SELECT * FROM users WHERE name LIKE '%{name}%'"
cursor.execute(query)
results = cursor.fetchall()
conn.close()
return jsonify(results)
# Attacco: GET /users/search?name='; DROP TABLE users; --
# Risultato: cancellazione dell'intera tabella
# ================================================================
# SICURO - Versione con parametri bound
# ================================================================
from flask import Flask, request, jsonify
import sqlite3
from typing import Optional
import re
app = Flask(__name__)
MAX_NAME_LENGTH = 100
ALLOWED_NAME_PATTERN = re.compile(r'^[a-zA-Z\s\-\']+






