🛠 GoSec Checker
Салют, давай продолжим и посмотрим на анализатор, который тебе точно нужен, если ты пишешь или тестишь на golang.
Инструмент сканирует AST и SSA для обнаружения уязвимостей, которые упускают grep-based сканеры. Находит небезопасные запросы к БД, Path Traversal, захардкоженные секреты, токены, ключи и тд, а также и умеет в taint analysis, то есть поиск от user input до sink. Работает out-of-the-box. Форматы вывода - JSON, SARIF, JUnit XML, HTML, md по типу gosec -fmt=json -out=report.json ./...
Команды
brew install gosec
# Через go install
go install github.com/securego/gosec/v2/cmd/gosec@latest
# Скан конкретного пакета
gosec ./cmd/server/...
# Скан с детализацией
gosec -verbose=text ./...
# Только конкретные правила
gosec -include=G101,G201,G401 ./...
# Исключить конкретные правила
gosec -exclude=G104,G304 ./...
# Только высокие уязвимости
gosec -severity=high ./...
Конфигурация .gosec.json
{
"exclude": ["G104", "G304"],
"severity": "medium",
"confidence": "medium",
"exclude-dirs": [
"vendor",
"test"
],
"global": {
"nosec": "enabled",
"audit": "enabled"
}
}
Пример по Path Traversal
func ReadFile(filename string) ([]byte, error) {
return ioutil.ReadFile("/data/" + filename)
// Атакующий может передать: ../../etc/passwd
}
CI/CD
name: Gosec Security Scan
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
gosec:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.22'
- name: Run Gosec
uses: securego/gosec@master
with:
args: '-fmt sarif -out gosec.sarif ./...'
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: gosec.sarif
Полезная фишка в виде метрик
# Получить количество находок по severity
gosec -fmt=json ./... | jq '.Stats.num_issues'
# Топ-5 правил с наибольшим количеством срабатываний
gosec -fmt=json ./... | jq '.Issues | group_by(.rule_id) | map({rule: .[0].rule_id, count: length}) | sort_by(.count) | reverse | .[0:5]'
Итого:
• Некоторые правила, например, G104 ("errors.go") генерируют огромное количество предупреждений при сканировании в стандартном проекте коде
• Встроенные правила поиска credentials могут выдавать FP на комментарии и текстовые строки в коде
• Поддежка gosec ruleset есть в инструменте Semgrep, что ставит под вопрос использование двух разных инструментов
• Можно переиспользовать вместо нескольких тулов как единый вход, если у вас база только на golang
• Максимально простой и user friendly
• Zero Config и работает из коробки
• Не является policy engine, следовательно, не осуществляет policy-as-code подхода
• Ограниченно способен поддерживать политики в качестве инструмента Security Gate
• Парсит код в AST с помощью стандартного пакета "go-ast" и применяет набор встроенных правил для поиска небезопасных паттернов
• Инструмент имеет 40 базовых правил
• Исключать правила из сканирования, а также их настраивать возможно с помощью файла конфигурации "gosec.json"
Сноска
• AST - Abstract Syntax Tree: — древовидное представление структуры исходного кода, то есть "Что написано"
FuncDecl
├── Name: "add"
├── Params: [a int, b int]
├── Results: [int]
└── Body:
└── ReturnStmt
└── BinaryExpr (+)
├── Ident: "a"
└── Ident: "b"
• SSA - Static Single Assignment: промежуточное представление, где для каждой переменной присваивание разовое, то есть "откуда и куда"
#toolchain #sast #appsec #reco #techsolution #term
