SAST 스캔
코드를 작성하면서 보안 취약점을 미리 발견하고 싶으신가요? SAST(Static Application Security Testing)는 소스 코드를 실행하지 않고 정적으로 분석하여 보안 취약점을 탐지하는 기술입니다. 마치 코드 리뷰어가 보안 관점에서 코드를 검토하는 것과 같습니다.
보안 취약점은 개발 초기에 발견할수록 수정 비용이 낮습니다. SAST를 CI/CD 파이프라인에 통합하면 코드가 커밋될 때마다 자동으로 보안 점검이 이루어져, 취약점이 프로덕션까지 도달하는 것을 방지할 수 있습니다.

개요
- 분석 대상: 소스 코드
- 분석 시점: Source 단계 (코드 커밋/푸시 시)
- 분석 엔진: CodeQL, Semgrep
- 지원 언어: Java, JavaScript, Python, Go, C/C++, Ruby, C# 등
지원 분석 엔진
KIWI는 두 가지 강력한 SAST 엔진을 제공합니다. 각 엔진의 특성을 이해하고 상황에 맞게 선택하세요.
CodeQL
GitHub에서 개발한 코드 분석 엔진으로, 심층적인 데이터 흐름 분석을 제공합니다.
- 분석 방식: 데이터 흐름 분석 - 변수가 어디서 생성되어 어디까지 흘러가는지 추적
- 강점: 복잡한 취약점 탐지에 뛰어남, 낮은 오탐율
- 지원 언어: Java, JavaScript, Python, Go, C++, C#, Ruby
- 분석 시간: 상대적으로 오래 걸림 (5-30분)
Semgrep
경량 정적 분석 도구로, 패턴 기반의 빠른 분석을 제공합니다.
- 분석 방식: 패턴 매칭 - 정의된 패턴과 일치하는 코드를 탐지
- 강점: 빠른 분석 속도, 커스텀 규칙 작성 용이
- 지원 언어: 30개 이상 언어 지원
- 분석 시간: 매우 빠름 (1-5분)
- 보안 감사나 릴리스 전 점검: CodeQL 권장 (더 정밀한 분석)
- 일상적인 CI 통합: Semgrep 권장 (빠른 피드백)
- 종합적인 분석: 둘 다 사용 권장 (각 엔진이 다른 유형의 취약점을 발견할 수 있음)
Step 1: SAST 스캔 시작하기
- [서비스 관리] 페이지로 이동합니다.
- 분석할 서비스를 선택합니다.
- 파이프라인에서 Source 단계를 클릭합니다.
- SAST 탭을 선택합니다.
- 스캔 시작 버튼을 클릭합니다.
Step 2: 분석 설정
2.1 분석 엔진 선택
상황에 맞는 엔진을 선택하세요:
- CodeQL: 심층 분석이 필요할 때, 보안 감사에 권장
- Semgrep: 빠른 분석이 필요할 때, CI 통합에 권장
- 둘 다: 종합적인 분석을 원할 때 (권장)
2.2 분석 프로필 선택
CodeQL 프로필:
- Default: 기본 보안 규칙 세트입니다. 대부분의 경우에 적합합니다.
- Security: 보안에 특화된 규칙 세트입니다. 보안 감사 시 권장됩니다.
- Extended: 확장된 규칙 세트입니다. 더 많은 취약점을 탐지하지만 분석 시간이 길어집니다.
Semgrep 프로필:
- p/default: 기본 규칙 세트입니다. 일반적인 보안 점검에 적합합니다.
- p/owasp-top-ten: OWASP Top 10 취약점에 집중합니다. 웹 애플리케이션에 권장됩니다.
- p/security-audit: 종합적인 보안 감사용 규칙입니다. 철저한 점검이 필요할 때 사용하세요.
OWASP(Open Web Application Security Project)에서 발표하는 웹 애플리케이션의 10대 보안 취약점 목록입니다. SQL Injection, XSS, 인증 취약점 등 가장 흔하고 위험한 취약점들이 포함되어 있습니다.
Step 3: 분석 실행
3.1 분석 진행
스캔이 시작되면 다음과 같은 단계로 진행됩니다:
[1/4] Cloning repository... ← 소스 코드 가져오기
[2/4] Setting up analysis environment... ← 분석 환경 준비
[3/4] Running CodeQL analysis... ← CodeQL 분석 실행
→ Extracting source code... ← 코드 추출
→ Building database... ← 분석용 데이터베이스 생성
→ Running queries... ← 취약점 쿼리 실행
[4/4] Running Semgrep analysis... ← Semgrep 분석 실행
→ Loading rules... ← 규칙 로드
→ Scanning files... ← 파일 스캔
Analysis completed! ← 완료
3.2 분석 상태
- Idle: 분석 대기 중
- Analyzing: 분석 진행 중 (진행률 확인 가능)
- Completed: 분석 완료 (결과 확인 가능)
- Failed: 분석 실패 (오류 메시지 확인 필요)
Step 4: 결과 확인
분석이 완료되면 결과 화면에서 발견된 취약점을 확인할 수 있습니다.
4.1 결과 요약
- 총 발견 수: 탐지된 취약점의 총 개수
- 심각도별 분류: Critical/High/Medium/Low로 분류된 취약점 수
- 규칙별 분류: SQL Injection, XSS 등 취약점 유형별 분류
4.2 취약점 상세
각 취약점을 클릭하면 다음 정보를 확인할 수 있습니다:
- 파일 위치: 취약점이 발견된 파일 경로와 라인 번호
- 취약점 유형: SQL Injection, XSS, Command Injection 등
- 심각도: Critical/High/Medium/Low
- 설명: 이 취약점이 왜 위험한지에 대한 상세 설명
- 수정 권장: 취약점을 어떻게 수정해야 하는지 안내
- CWE ID: 표준 취약점 분류 식별자 (예: CWE-89는 SQL Injection)
모든 취약점을 한 번에 수정하기 어렵다면, Critical과 High 심각도부터 수정하세요. 특히 인증/인가 관련 취약점과 인젝션 취약점은 최우선으로 해결해야 합니다.
주요 탐지 취약점 유형
SAST가 탐지하는 대표적인 취약점 유형을 알아두면 코드 작성 시 미리 예방할 수 있습니다.
인젝션 (Injection)
외부 입력이 그대로 쿼리나 명령어에 사용되면 발생합니다.
-
SQL Injection (CWE-89): 사용자 입력이 SQL 쿼리에 직접 삽입되는 경우
// 취약한 코드
String query = "SELECT * FROM users WHERE id = " + userId;
// 안전한 코드
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
stmt.setString(1, userId); -
Command Injection (CWE-78): 사용자 입력이 OS 명령어에 사용되는 경우
-
LDAP Injection (CWE-90): 사용자 입력이 LDAP 쿼리에 삽입되는 경우
인증/인가 (Auth)
인증 및 권한 검사와 관련된 취약점입니다.
- Broken Authentication (CWE-287): 인증을 우회할 수 있는 결함
- Hardcoded Credentials (CWE-798): 소스 코드에 비밀번호나 API 키가 하드코딩됨
- Insufficient Authorization (CWE-285): 권한 검사가 불충분함
소스 코드에 비밀번호, API 키, 토큰 등을 직접 작성하지 마세요. 환경 변수나 시크릿 관리 도구를 사용하세요. Git 히스토리에 한 번 기록되면 제거하기 어렵습니다.
데이터 노출 (Exposure)
민감한 데이터가 의도치 않게 노출될 수 있는 취약점입니다.
- XSS (CWE-79): 웹 페이지에 악성 스크립트가 삽입될 수 있음
- Sensitive Data Exposure (CWE-200): 로그나 에러 메시지에 민감정보 노출
- Path Traversal (CWE-22):
../를 사용해 의도하지 않은 파일에 접근 가능
자동 스캔 설정
매번 수동으로 스캔을 실행하는 것은 번거롭습니다. Auto CI를 설정하면 코드가 푸시될 때마다 자동으로 SAST가 실행됩니다.
Auto CI와 연동
Auto CI 설정에서 SAST 자동 실행을 설정하세요:
- Auto CI 설정 모달을 엽니다.
- 보안 분석 섹션에서 SAST를 활성화합니다.
- 분석 엔진과 프로필을 선택합니다.
- 저장을 클릭합니다.
스캔 트리거
- Push: 코드가 푸시될 때마다 자동 스캔
- Merge Request: MR이 생성되면 자동 스캔 (코드 리뷰 전 보안 점검)
- Manual: 필요할 때 수동으로 스캔
Merge Request 시 SAST를 자동 실행하면, 코드 리뷰 시 보안 취약점도 함께 검토할 수 있습니다. 취약점이 발견되면 MR 코멘트로 알려주어 코드가 병합되기 전에 문제를 해결할 수 있습니다.
문제 해결
분석 실패
분석이 실패했다면 다음을 확인해보세요:
-
지원하지 않는 언어: CodeQL과 Semgrep의 지원 언어 목록을 확인하세요. 지원하지 않는 언어는 분석할 수 없습니다.
-
코드 접근 불가: Git 토큰에 저장소 읽기 권한이 있는지 확인하세요. 토큰이 만료되었을 수도 있습니다.
-
타임아웃: 대용량 저장소의 경우 분석 시간이 오래 걸릴 수 있습니다. 분석 범위를 특정 디렉토리로 제한하거나, 타임아웃 설정을 늘려보세요.
오탐(False Positive) 처리
SAST는 때때로 실제로는 취약하지 않은 코드를 취약점으로 보고할 수 있습니다.
-
무시 처리: 확인된 오탐은 결과에서 "무시"로 표시하여 다음 스캔에서 제외합니다.
-
규칙 조정: 특정 규칙이 너무 많은 오탐을 발생시키면 커스텀 프로필을 생성하여 해당 규칙을 비활성화합니다.
-
주석 추가: 코드에
// nosec또는// nosemgrep주석을 추가하여 특정 라인을 스캔에서 제외합니다.String password = "test123"; // nosec - 테스트 환경 전용
오탐이 너무 많으면 개발자들이 SAST 결과를 무시하게 됩니다. 확인된 오탐은 적극적으로 무시 목록에 추가하여, 진짜 취약점에 집중할 수 있도록 관리하세요.
관련 가이드
- SCA 스캔 - 의존성 취약점 분석
- DAST 스캔 - 동적 보안 테스트
- Auto CI 설정 - 자동 분석 설정