fix(build): не дать скану обходов security-gate поймать самого себя
Третий раз в этом файле: скан `code_mentions_in "$bypass_var" tools/build` находил строку `for bypass_var in ALLOW_VULNERABLE_DEPENDENCIES SKIP_SECURITY_SCAN` в самой приёмке. Это код, а не комментарий, поэтому code_without_comments не помогал, и проверка гарантированно падала бы на корректном дереве — снова в конце сборки. Сканируются перечисленные модули сборки, а не весь каталог. Заодно code_without_comments выбирает вид комментария по расширению: решётка отбрасывается только в shell. В шаблоне Vue строка вполне может начинаться с `#default="scope"` — это сокращение v-slot, и общий фильтр молча выбрасывал бы её из сканов по apps/frontend/src.
This commit is contained in:
@@ -13,13 +13,20 @@ set -euo pipefail
|
||||
# удалённые маршруты, чтобы доказать их отсутствие. Помощник существует, чтобы
|
||||
# третьего раза не было.
|
||||
#
|
||||
# Отбрасываются оба вида строк-комментариев: `//` для Go и TypeScript, `#` для
|
||||
# shell. Раньше стриплось только `//`, поэтому сканы по tools/build/*.sh не
|
||||
# работали вовсе — там комментарии начинаются с решётки, и объяснение «почему
|
||||
# этого больше нет» считалось за код. Ни один из языков не использует префикс
|
||||
# другого для чего-то иного, так что общий фильтр безопасен для обоих.
|
||||
# Вид комментария выбирается по расширению файла.
|
||||
#
|
||||
# Раньше отбрасывались только строки, начинающиеся с `//`, поэтому сканы по
|
||||
# tools/build/*.sh не работали вовсе: там комментарии начинаются с решётки, и
|
||||
# объяснение «почему этого больше нет» считалось за код.
|
||||
#
|
||||
# Решётка при этом отбрасывается ТОЛЬКО в shell. В шаблоне Vue строка вполне
|
||||
# может начинаться с `#default="scope"` — это сокращение для v-slot, а не
|
||||
# комментарий, и общий фильтр молча выбрасывал бы её из скана.
|
||||
code_without_comments() {
|
||||
grep -vE '^[[:space:]]*(//|#)' "$1" 2>/dev/null || true
|
||||
case "$1" in
|
||||
*.sh) grep -vE '^[[:space:]]*#' "$1" 2>/dev/null || true ;;
|
||||
*) grep -v '^[[:space:]]*//' "$1" 2>/dev/null || true ;;
|
||||
esac
|
||||
}
|
||||
|
||||
# code_mentions_in отдаёт список файлов, где подстрока встречается В КОДЕ.
|
||||
@@ -638,11 +645,26 @@ run_dependency_hygiene_acceptance() {
|
||||
# Противоречие закрыто в пользу строгой политики, и теперь это проверяется, а
|
||||
# не только описано. Ищется КОД: комментарий выше объясняет, почему обходов
|
||||
# нет, и обязан называть их по имени.
|
||||
local bypass_var bypass_hits
|
||||
#
|
||||
# Сканируются модули, которые могли бы обход вернуть, а НЕ весь tools/build.
|
||||
# Причина ровно та, из-за которой в этом файле дважды падала сборка на
|
||||
# корректном коде: скан по всему каталогу находил сам себя — строку
|
||||
# `for bypass_var in ALLOW_VULNERABLE_DEPENDENCIES SKIP_SECURITY_SCAN` ниже.
|
||||
# Это код, а не комментарий, поэтому code_without_comments тут не спасает.
|
||||
local bypass_var bypass_scan_file bypass_hits
|
||||
for bypass_var in ALLOW_VULNERABLE_DEPENDENCIES SKIP_SECURITY_SCAN; do
|
||||
bypass_hits="$(code_mentions_in "$bypass_var" tools/build)"
|
||||
for bypass_scan_file in \
|
||||
tools/build/build.sh \
|
||||
tools/build/lib/security.sh \
|
||||
tools/build/lib/package.sh \
|
||||
tools/build/lib/versions.sh \
|
||||
tools/build/lib/deps.sh \
|
||||
tools/build/lib/verify.sh
|
||||
do
|
||||
bypass_hits="$(code_without_comments "$bypass_scan_file" | grep -F -- "$bypass_var" || true)"
|
||||
[ -z "$bypass_hits" ] \
|
||||
|| fail "acceptance: обход проверки зависимостей $bypass_var вернулся в: $bypass_hits"
|
||||
|| fail "acceptance: обход проверки зависимостей $bypass_var вернулся в $bypass_scan_file: $bypass_hits"
|
||||
done
|
||||
done
|
||||
|
||||
# И в документации тоже: описанный, но нерабочий аварийный выход — хуже, чем
|
||||
|
||||
Reference in New Issue
Block a user