SARIF
GitHub, GitLab, Azure DevOps와 CI/CD 통합을 위한 SARIF v2.1.0 출력을 생성합니다.
SARIF v2.1.0 (Static Analysis Results Interchange Format) 형식으로 결과를 출력합니다. GitHub Code Scanning, GitLab, Azure DevOps 등 주요 CI/CD 플랫폼에서 바로 읽을 수 있는 표준 형식입니다.
왜 SARIF인가?
- 보안 도구 생태계 전반에서 쓰이는 OASIS 표준
- GitHub Code Scanning, GitLab, Azure DevOps에서 네이티브 지원
- 심각도, 파일 위치 등 풍부한 메타데이터 포함
- 파이프라인에서 보안 게이트를 자동화할 수 있음
사용법
SARIF 출력을 생성합니다.
noir scan . -f sarif --no-log
파일로 저장할 수도 있습니다.
noir scan . -f sarif -o results.sarif --no-log
출력 예제
SARIF 파일은 runs 배열로 구성됩니다. 각 run에는 도구 정보(driver의 이름, 버전), 분석 규칙, results(엔드포인트별 소스 파일 위치와 줄 번호), 그리고 invocations가 들어갑니다. invocations의 executionSuccessful은 JSON 출력의 errors 키와 같은 사실을 알려 주며, 분석기가 실패했거나 건너뛴 파일이 있으면 false가 됩니다.
{
"$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/main/sarif-2.1/schema/sarif-schema-2.1.0.json",
"version": "2.1.0",
"runs": [
{
"tool": {
"driver": {
"name": "OWASP Noir",
"version": "1.3.0",
"informationUri": "https://github.com/owasp-noir/noir",
"rules": [
{
"id": "endpoint-discovery",
"name": "Endpoint Discovery",
"shortDescription": {
"text": "Discovered API endpoints through static analysis"
},
"fullDescription": {
"text": "This rule identifies API endpoints, their HTTP methods, and parameters discovered through static code analysis"
},
"defaultConfiguration": {
"level": "note"
},
"helpUri": "https://github.com/owasp-noir/noir"
}
]
}
},
"results": [
{
"ruleId": "endpoint-discovery",
"ruleIndex": 0,
"level": "note",
"message": {
"text": "GET /api/users/:id (Parameters: path: id)"
},
"locations": [
{
"physicalLocation": {
"artifactLocation": {
"uri": "src/routes.cr"
},
"region": {
"startLine": 42
}
}
}
]
},
{
"ruleId": "endpoint-discovery",
"ruleIndex": 0,
"level": "note",
"message": {
"text": "POST /api/users (Parameters: json: username, json: email)"
},
"locations": [
{
"physicalLocation": {
"artifactLocation": {
"uri": "src/routes.cr"
},
"region": {
"startLine": 56
}
}
}
]
}
],
"invocations": [
{
"executionSuccessful": true
}
]
}
]
}
SARIF 기능
엔드포인트 발견
각 엔드포인트는 아래 정보와 함께 SARIF result로 보고됩니다.
- Rule ID:
endpoint-discovery - Level:
note(정보성 발견) - Message: HTTP 메서드, URL 경로, 파라미터
- Location: 엔드포인트가 정의된 파일 경로와 줄 번호
패시브 스캔 통합
패시브 스캔(-P 또는 --passive-scan)을 함께 쓰면 보안 발견 사항이 심각도에 따라 SARIF에 포함됩니다.
- Critical/High →
error - Medium →
warning - Low →
note
각 패시브 스캔 규칙은 설명, 참조, 작성자 정보와 함께 rules 배열에 추가됩니다.
통합 예제
GitHub Code Scanning
SARIF 결과를 GitHub Code Scanning에 업로드하면 리포지토리 Security 탭에서 바로 확인할 수 있습니다.
# SARIF 출력 생성
noir scan . -f sarif -o noir-results.sarif --no-log
# GitHub에 업로드 (GitHub CLI 사용)
gh api /repos/:owner/:repo/code-scanning/sarifs \
-F sarif=@noir-results.sarif \
-F ref=refs/heads/main \
-F commit_sha=$(git rev-parse HEAD)
GitLab Security Dashboard
.gitlab-ci.yml에 아래 잡을 추가하면 GitLab Security Dashboard에 결과가 표시됩니다.
noir_scan:
script:
- noir scan . -f sarif -o gl-sast-report.json --no-log
artifacts:
reports:
sast: gl-sast-report.json
Azure DevOps
Azure Pipelines에서 SARIF 파일을 빌드 아티팩트로 게시하면 SARIF SAST Scans Tab 확장에서 결과를 볼 수 있습니다.
- script: noir scan . -f sarif -o noir.sarif --no-log
displayName: 'Run Noir Scan'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: 'noir.sarif'
ArtifactName: 'CodeAnalysisLogs'