
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/.:" ./...