
gosec v2.28.0
Go 보안 검사기
gosec - Go 보안 검사기
Go AST 및 SSA 코드 표현을 스캔하여 소스 코드의 보안 문제를 검사합니다.
빠른 링크
기능
- 패턴 기반 규칙 for detecting common security issues in Go code
- SSA 기반 분석기 for type conversions, slice bounds, and crypto issues
- 오염 분석 for tracking data flow from user input to dangerous functions (SQL 인젝션, 명령어 인젝션, 경로 탐색, SSRF, XSS, 로그 인젝션, SMTP 인젝션, SSTI, 안전하지 않은 역직렬화, 오픈 리다이렉트)
라이선스
Apache 라이선스 2.0 버전(이하 "라이선스")에 따라 라이선스가 부여됩니다. 라이선스를 준수하지 않는 한 이 파일을 사용할 수 없습니다. 라이선스 사본은 여기에서 얻을 수 있습니다.
프로젝트 상태
설치
GitHub 액션
gosec을 GitHub 액션으로 다음과 같이 실행할 수 있습니다:
최신 안정 릴리스에 고정된 @master와 함께 버전 태그를 사용하세요. 이는 안정적인 동작을 제공합니다.```yaml
name: Run Gosec
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
tests:
runs-on: ubuntu-latest
env:
GO111MODULE: on
steps:
- name: Checkout Source
uses: actions/checkout@v3
- name: Run Gosec Security Scanner
uses: securego/gosec@master
with:
args: ./...
#### 비공개 모듈로 프로젝트 스캔하기
프로젝트에서 비공개 Go 모듈을 임포트하는 경우,
`gosec`가 의존성을 가져올 수 있도록 인증을 구성해야 합니다.
워크플로에서 다음 환경 변수를 설정하세요:
- `GOPRIVATE`: 비공개로 간주되어야 하는 모듈 경로 접두사의
쉼표로 구분된 목록
(예: `github.com/your-org/*`).
- `GITHUB_AUTHENTICATION_TOKEN`: 비공개 리포지토리에 대한
읽기 접근 권한이 있는 GitHub 토큰.```yaml
name: Run Gosec
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
tests:
runs-on: ubuntu-latest
env:
GO111MODULE: on
GOPRIVATE: github.com/your-org/*
GITHUB_AUTHENTICATION_TOKEN: ${{ secrets.PRIVATE_REPO_TOKEN }}
steps:
- name: Checkout Source
uses: actions/checkout@v3
- name: Run Gosec Security Scanner
uses: securego/gosec@v2
with:
args: ./...
코드 스캔과의 통합
타사 코드 분석 도구를 통합하여 SARIF 파일로 데이터를 업로드함으로써 GitHub 코드 스캔과 연동할 수 있습니다.
워크플로는 GitHub Actions 워크플로의 한 단계로 gosec를 실행하여
results.sarif 파일을 출력하는 예를 보여줍니다.
그런 다음 워크플로는 upload-sarif 액션을 사용하여
results.sarif 파일을 GitHub에 업로드합니다.```yaml
name: "Security Scan"
Run workflow each time code is pushed to your repository and on a schedule.
The scheduled workflow runs every at 00:00 on Sunday UTC time.
on: push: schedule:
- cron: '0 0 * * 0'
jobs: tests: runs-on: ubuntu-latest env: GO111MODULE: on steps: - name: Checkout Source uses: actions/checkout@v3 - name: Run Gosec Security Scanner uses: securego/gosec@v2 with: # we let the report trigger content trigger a failure using the GitHub Security features. args: '-no-fail -fmt sarif -out results.sarif ./...' - name: Upload SARIF file uses: github/codeql-action/upload-sarif@v2 with: # Path to SARIF file relative to the root of the repository sarif_file: results.sarif
### Go 분석
`goanalysis` 패키지는
[`golang.org/x/tools/go/analysis.Analyzer`](https://pkg.go.dev/golang.org/x/tools/go/analysis)
를 제공하며, 표준 Go 분석 인터페이스를 지원하는 도구(예: Bazel의
[nogo](https://github.com/bazelbuild/rules_go/blob/master/go/nogo.rst)
프레임워크)
와의 통합을 위한 것입니다:```starlark
nogo(
name = "nogo",
deps = [
"@com_github_securego_gosec_v2//goanalysis",
# add more analyzers as needed
],
visibility = ["//visibility:public"],
)
로컬 설치
gosec는 Go 1.25 이상이 필요합니다.```bash go install github.com/securego/gosec/v2/cmd/gosec@latest
## 빠른 시작```bash
# Scan all packages in current module
gosec ./...
# Write JSON report
gosec -fmt json -out results.json ./...
# Write SARIF report for code scanning
gosec -fmt sarif -out results.sarif ./...
종료 코드
0: 스캔이 표시되지 않은 발견/오류 없이 완료됨1: 하나 이상의 표시되지 않은 발견 또는 처리 오류- 항상
0을 반환하려면-no-fail을 사용하세요
사용법
Gosec는 규칙의 하위 집합만 실행하도록 구성하거나, 특정 파일 경로를 제외하고, 다양한 형식으로 보고서를 생성할 수 있습니다. 기본적으로 모든 규칙이 제공된 입력 파일에 대해 실행됩니다. 현재 디렉토리에서 재귀적으로 스캔하려면 입력 인수로 ./...를 제공할 수 있습니다.
사용 가능한 규칙
gosec는 다음 범주에 걸친 규칙을 포함합니다:
G1xx: 일반적인 보안 코딩 문제 (예: 하드코딩된 자격 증명, 안전하지 않은 사용, HTTP 강화, 쿠키 보안)G2xx: 쿼리/템플릿/명령 구성의 주입 위험G3xx: 파일 및 경로 처리 위험 (권한, 트래버설, 임시 파일, 아카이브 추출)G4xx: 암호화 및 TLS 취약점G5xx: 차단 목록에 있는 임포트G6xx: Go 특화 정확성/보안 검사 (예: 범위 별칭 및 슬라이스 경계)G7xx: 오염 분석 규칙 (SQL 인젝션, 명령 인젝션, 경로 트래버설, SSRF, XSS, 로그, SMTP 인젝션, SSTI, 안전하지 않은 역직렬화, 오픈 리다이렉트)
전체 목록, 규칙 설명 및 규칙별 구성에 대해서는 RULES.md를 참조하세요.
폐기된 규칙
- G105: math/big.Int.Exp 사용 감사 - CVE 수정됨
- G307: 오류를 반환하는 메서드 지연 - 이 블로그 게시물의 세부 사항에도 불구하고 보안 문제를 해결하는 것보다 더 많은 불편을 초래함
규칙 선택
기본적으로 gosec는 제공된 파일 경로에 대해 모든 규칙을 실행합니다. 그러나 -include= 플래그를 사용하여 실행할 규칙의 하위 집합을 선택하거나, -exclude= 플래그를 사용하여 명시적으로 제외할 규칙 집합을 지정할 수 있습니다.```bash
Run a specific set of rules
$ gosec -include=G101,G203,G401 ./...
Run everything except for rule G303
$ gosec -exclude=G303 ./...
### CWE 매핑
`gosec`에 의해 발견된 모든 문제는 취약점을 보다 일반적인 용어로 설명하는
[CWE (Common Weakness Enumeration)](http://cwe.mitre.org/data/index.html)에
매핑됩니다. 정확한 매핑은
[여기](https://github.com/securego/gosec/blob/master/issue/issue.go#L50)에서
확인할 수 있습니다.
### 구성
구성 파일에서 다음과 같이 여러 전역 설정을 제공할 수 있습니다:```JSON
{
"global": {
"nosec": "enabled",
"audit": "enabled"
}
}
nosec: 이 설정은 코드 베이스 전체에 정의된 모든#nosec지시자를 덮어씁니다.audit: 감사 모드로 실행되며, 일반적인 코드 분석에서는 너무 지나칠 수 있는 추가 검사를 활성화합니다.```bash
Run with a global configuration file
$ gosec -conf config.json .
### 경로 기반 규칙 제외
여러 구성 요소를 가진 대규모 저장소는 경로에 따라 다른 보안 규칙이 필요할 수 있습니다. `exclude-rules`를 사용하여 특정 경로에 대해 특정 규칙을 억제하세요.
**설정 파일:**```json
{
"exclude-rules": [
{
"path": "cmd/.*",
"rules": ["G204", "G304"]
},
{
"path": "scripts/.*",
"rules": ["*"]
}
]
}
CLI 플래그:```bash
Exclude G204 and G304 from cmd/ directory
gosec --exclude-rules="cmd/.*:G204,G304" ./...
Exclude all rules from scripts/ directory
gosec --exclude-rules="scripts/.:" ./...
Multiple exclusions
gosec --exclude-rules="cmd/.:G204,G304;test/.:G101" ./...
| 필드 | 유형 | 설명 |
|-------|------|-------------|
| `path` | string (regex) | 파일 경로와 매칭되는 정규식 |
| `rules` | []string | 제외할 규칙 ID. `*`는 모두 |
#### 규칙 구성
일부 규칙은 구성 플래그도 허용합니다; 이러한 플래그는
[RULES.md](https://github.com/securego/gosec/blob/master/RULES.md)에 문서화되어 있습니다.
#### Go 버전
일부 규칙은 프로젝트에 있는 Go 모듈 파일에서 검색된 특정 Go 버전이 필요합니다. 이 버전을 찾을 수 없는 경우 Go 런타임 버전으로 대체됩니다.
Go 모듈 버전은 `go list` 명령을 사용하여 구문 분석되며, 경우에 따라 성능 저하가 발생할 수 있습니다. 이 상황에서는 환경 변수
`GOSECGOVERSION=go1.21.1`을 설정하여 Go 모듈 버전을 쉽게 제공할 수 있습니다.
### 종속성
gosec는 Go 모듈을 사용하여 패키지를 로드합니다. 대부분의 프로젝트에서 종속성은 스캔 중에 자동으로 해결됩니다.
종속성이 없는 경우, 실행하십시오:```bash
go mod tidy
go mod download
테스트 파일 및 폴더 제외
gosec는 모든 패키지의 테스트 파일과 vendor 디렉터리의 모든 종속성을 무시합니다.
테스트 파일 스캔은 다음 플래그를 사용하여 활성화할 수 있습니다. 플래그:```bash gosec -tests ./...
또한 다음과 같이 추가 폴더를 제외할 수 있습니다:```bash
gosec -exclude-dir=rules -exclude-dir=cmd ./...
생성된 파일 제외
gosec는 기본 생성 코드 주석이 있는 생성된 go 파일을 무시할 수 있습니다.``` // Code generated by some generator DO NOT EDIT.
Please provide the Markdown content to translate.```bash
gosec -exclude-generated ./...
취약점 자동 수정
gosec는 AI 추천 기반으로 수정 사항을 제안할 수 있습니다. 보안 찾기에 대한 제안을 받기 위해 AI API를 호출합니다.
다음 명령줄 인수를 제공하여 이 기능을 활성화할 수 있습니다:
ai-api-provider: AI API 제공자의 이름입니다. 지원되는 제공자:- Atlas Cloud:
atlas(기본 모델deepseek-ai/deepseek-v4-flash),atlas-deepseek-v4-flash,atlas-qwen3-coder-next,atlas-kimi-k2.6, 또는 Atlas Cloud가 호스팅하는 모든 채팅 모델의 경우atlas:<model-id>. Atlas Cloud는 atlascloud.ai에서 제공되는 OpenAI 호환 제공자입니다. - Gemini:
gemini-3-pro-preview(기본값),gemini-2.5-pro,gemini-2.5-flash,gemini-2.5-flash-lite - Claude:
claude-sonnet-4-6(기본값),claude-opus-4-7,claude-opus-4-6,claude-sonnet-4-5,claude-opus-4-5,claude-haiku-4-5 - OpenAI:
gpt-5.4(기본값),gpt-5.4-mini,gpt-5.4-nano - Custom OpenAI-compatible: 모든 사용자 정의 모델 이름 (
ai-base-url필요)
- Atlas Cloud:
ai-api-key또는 환경 변수GOSEC_AI_API_KEY설정: AI API에 접근하는 키- Gemini의 경우 다음 지침에 따라 API 키를 생성할 수 있습니다.
- Claude의 경우 Anthropic Console에서 API 키를 받으세요.
- OpenAI의 경우 OpenAI Platform에서 API 키를 받으세요.
ai-base-url: (선택 사항) OpenAI 호환 API용 사용자 정의 기본 URL (예: Azure OpenAI, LocalAI, Ollama)- Atlas Cloud는 기본적으로
https://api.atlascloud.ai/v1을 사용하므로, 내장atlas제공자의 경우ai-base-url은 선택 사항입니다.
- Atlas Cloud는 기본적으로
GOSEC_AI_PROVIDER: (선택 사항)ai-api-provider의 대체 환경 변수GOSEC_AI_BASE_URL: (선택 사항)ai-base-url의 대체 환경 변수ai-skip-ssl: (선택 사항) AI API에 대한 SSL 인증서 확인 건너뛰기 (자체 서명된 인증서에 유용)
🎁 Atlas Cloud 는 개발자에게 비디오 생성, 이미지 생성 및 LLM API에 대한 단일 AI API를 제공하는 전체 모달 AI 추론 플랫폼입니다. 여러 공급업체 통합을 관리하는 대신 한 번 연결하여 300개 이상의 큐레이션 모델에 대한 통합 액세스를 얻을 수 있습니다.
Atlas Cloud의 새로운 코딩 플랜 프로모션을 확인하여 더 예산 친화적인 API 액세스를 이용하세요: https://www.atlascloud.ai/console/coding-plan
예제:```bash
Using Atlas Cloud with the default DeepSeek V4 Flash model
export GOSEC_AI_API_KEY="your_key" export GOSEC_AI_PROVIDER="atlas" gosec ./...
Using Atlas Cloud with an explicit hosted model
GOSEC_AI_API_KEY="your_key"
gosec -ai-api-provider="atlas:qwen/qwen3-coder-next" ./...
Using Gemini
gosec -ai-api-provider="gemini-3-pro-preview"
-ai-api-key="your_key" ./...
Using Claude
gosec -ai-api-provider="claude-sonnet-4-6"
-ai-api-key="your_key" ./...
Using OpenAI
gosec -ai-api-provider="gpt-5.4"
-ai-api-key="your_key" ./...
Using Azure OpenAI
gosec -ai-api-provider="gpt-5.4"
-ai-api-key="your_azure_key"
-ai-base-url="https://your-resource.openai.azure.com/openai/deployments/your-deployment"
./...
Using local Ollama with custom model
gosec -ai-api-provider="llama3.2"
-ai-base-url="http://localhost:11434/v1"
./...
Using self-signed certificate API
gosec -ai-api-provider="custom-model"
-ai-api-key="your_key"
-ai-base-url="https://internal-api.company.com/v1"
-ai-skip-ssl
./...
### 코드 주석 처리
모든 자동화된 탐지 도구와 마찬가지로, 거짓 양성(false positive) 사례가 발생할 수 있습니다.
gosec가 수동으로 안전하다고 확인된 오류를 보고하는 경우, `#nosec`로 시작하는 주석을 코드에 추가할 수 있습니다.
`#nosec` 주석은 `#nosec [RuleList] [-- Justification]` 형식을 따라야 합니다.
`#nosec` 주석은 경고가 보고된 줄에 배치되어야 합니다.```go
func main() {
tr := &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true, // #nosec G402
},
}
client := &http.Client{Transport: tr}
_, err := client.Get("https://go.dev/")
if err != nil {
fmt.Println(err)
}
}
특정 오탐(false positive)이 식별되고 안전하다고 확인되었을 때,
해당 코드 섹션 내에서 단일 규칙(또는 특정 규칙 세트)만을 억제하고,
다른 문제에 대한 검색은 계속 진행하고 싶을 수 있습니다. 이를 위해
#nosec 주석 내에 억제할 규칙을 나열할 수 있습니다.
예: /* #nosec G401 */ 또는 //#nosec G201 G202 G203
주석에 설명 또는 정당화 텍스트를 넣을 수도 있습니다.
정당화 텍스트는 억제할 규칙 뒤에 위치해야 하며,
두 개 이상의 대시로 시작해야 합니다.
예: //#nosec G101 G102 -- This is a false positive
또는 gosec는 //gosec:disable 지시어도 지원하며,
이는 #nosec와 유사하게 작동합니다:```go
//gosec:disable G101 -- This is a false positive
In some cases you may also want to revisit places where
`#nosec` or `//gosec:disable` annotations have been used. To
run the scanner and ignore any `#nosec` annotations you can do
the following:```bash
gosec -nosec=true ./...
규칙 ID 및 사유 요구
주석이 관련 없는 규칙을 실수로 억제하거나 설명 없이 추가되는 것을 방지하기 위해, gosec는 두 개의 선택적 플래그를 제공합니다. 두 플래그 모두 기본값이 false이므로 기존 코드베이스는 변경 없이 그대로 작동합니다.
-nosec-require-rules는 규칙 ID를 나열하지 않은#nosec///gosec:disable지시어를 거부합니다.-nosec-require-justification는 규칙 목록 뒤에-- justification이 없는 지시어를 거부합니다.
활성화되면, 검사를 통과하지 못한 지시어는 더 이상 어떤 발견도 억제하지 않으며, 해당 라인의 기본 문제와 함께 출력에서 오류로 보고됩니다.```bash gosec -nosec-require-rules -nosec-require-justification ./...
동일한 옵션들은 글로벌 구성 블록을 통해 설정할 수 있습니다:```json
{
"global": {
"nosec-require-rules": "enabled",
"nosec-require-justification": "enabled"
}
}
억제 추적
위에서 설명한 대로, 위반 사항을 외부적으로(-include/-exclude 사용) 또는 인라인(#nosec 주석 사용)으로 억제할 수 있습니다. 감사를 위해 억제 메타데이터를 내보낼 수 있습니다.
-track-suppressions를 사용하여 억제 추적을 활성화합니다:```bash
gosec -track-suppressions -exclude=G101
-fmt=sarif -out=results.sarif ./...
- 외부 억제의 경우, gosec는 억제 정보를 기록합니다
여기서 `kind`는 `external`이고 `justification`은 `Globally suppressed.`입니다.
- 인라인 억제의 경우, gosec는 억제 정보를 기록합니다
여기서 `kind`는 `inSource`이고 `justification`은 주석에서 두 개 이상의 대시 뒤에 오는 텍스트입니다.
**참고:** SARIF 및 JSON 형식만 억제 추적을 지원합니다.
### 빌드 태그
gosec는 귀하의 [Go 빌드 태그](https://pkg.go.dev/go/build/)를 분석기에 전달할 수 있습니다.
다음과 같이 쉼표로 구분된 목록으로 제공할 수 있습니다:```bash
gosec -tags debug,ignore ./...
출력 형식
gosec는 text, json, yaml, csv, junit-xml,
html, sonarqube, golint, sarif 형식을 지원합니다. 기본적으로
결과는 표준 출력(stdout)으로 보고되지만, 출력 파일에 기록할 수도
있습니다. 출력 형식은 -fmt 플래그로 제어되며, 출력 파일은 -out 플래그로
다음과 같이 제어됩니다:```bash
Write output in json format to results.json
$ gosec -fmt=json -out=results.json *.go
`-stdout`을 사용하여 결과를 출력하면서 동시에 `-out`을 작성합니다.
`-verbose`를 사용하여 표준 출력 형식을 재정의하면서 파일 형식을 유지합니다.```bash
# Write output in json format to results.json as well as stdout
$ gosec -fmt=json -out=results.json -stdout *.go
# Overrides the output format to 'text' when stdout the results,
# while writing it to results.json
$ gosec -fmt=json -out=results.json -stdout -verbose=text *.go
참고: gosec는
generic issue import format
를 SonarQube용으로 생성하며, 보고서는 SonarQube로 가져와야 합니다
사용하여
sonar.externalIssuesReportPaths=path/to/gosec-report.json.
일반적인 사용 패턴```bash
Fail only on medium+ severity findings
gosec -severity medium ./...
Fail only on medium+ confidence findings
gosec -confidence medium ./...
Exclude specific rules for specific paths
gosec --exclude-rules="cmd/.:G204,G304;scripts/.:*" ./...
Exclude generated files in scan
gosec -exclude-generated ./...
Include test files in scan
gosec -tests ./...
## 개발
개발 문서가 다음으로 이동되었습니다.
[DEVELOPMENT.md](https://github.com/securego/gosec/blob/HEAD/DEVELOPMENT.md).
## gosec을 사용하는 곳은?
다음은 gosec 사용자 중 일부가 포함된 [목록](https://github.com/securego/gosec/blob/HEAD/USERS.md)입니다.
## 후원자
후원자가 되어 이 프로젝트를 지원해 주세요. 귀하의 로고가 여기에 표시되며 웹사이트 링크가 연결됩니다.
<a href="https://github.com/mercedes-benz" target="_blank"><img src="https://assets.kitploit.com/production/public/readmes/2947/08b6f9da5faff0e986172b0c77fed0865a2cb26e6f8c58a8ae588c74bcf16f5f.png"></a>