Учимся триажить баги и оценивать их влияние на продукт. Или о том как Product Security превращает finding в риск-решение
Практический ProdSec Vuln Triage playbook: triage → applicability → exposure → reachability → exploitability → blast radius → business impact → treatment → verification. Когда я работал SecOps инженером, одна из самых
Практический ProdSec Vuln Triage playbook: triage → applicability → exposure → reachability → exploitability → blast radius → business impact → treatment → verification.
Когда я работал SecOps инженером, одна из самых полезных вещей, которую мне пришлось усвоить, была довольно простой: красная цифра на счетчике CVSS или алерт Hight Impact в отчете сканера — это еще не доказуемый факт бага.
По классике все выглядит примерно так: Сканер уязвимостей или другая тула ассесмента может сказать, что у нас, например, рейт CVSS 9.8. Далее SCA может подсветить vulnerable dependency. А SAST может найти потенциальный sink. И еще круче, DAST может подтвердить поведение на работающем приложении. CNAPP может показать misconfiguration в инфраструктуре. Ну, а Bug bounty researcher может прислать PoC и запросить денежку:)
Только вот, как оказалось, это "не все" что нужно для принятиях технического решения. Нормальная адекватная инженерная работа — это не переслать finding разрабу со словами «Critical, fix ASAP». Инженерная работа Mid+\Senior SecOps — понять, что именно найдено, применимо ли это к продукту, достижим ли vulnerable path, кто может его атаковать, какие права получит атакующий, куда он сможет pivot’нуться дальше, что реально потеряет бизнес и какой response уменьшит риск быстрее всего.
Именно этим mindset я хочу поделиться в этой статье.
Главная идея такая:
CVSS — это severity signal. Приоритет ремонта появляется только после добавления контекста.
И современный контекст — это не одна дополнительная колонка в треке Jira. Это целая live цепочка: applicability, exposure, reachability, exploitability, threat intelligence, asset criticality, blast radius, compensating controls, business impact и confidence.
Разберем все по косточкам! Погнали!:)
DISCLAIMER
Архитектуры и часть scenarios в статье намеренно упрощены и используются как учебные модели. Реальные CVE и vendor statements отмечены отдельно. Reachability verdict никогда не должен строиться только на одном scanner signal: качество решения зависит от полноты evidence и понимания конкретного runtime environment.
Field card: карта triage, которую удобно держать перед глазами
Если нужно быстро объяснить весь mindset одним скрином, я бы оставил себе такую карточку:
FINDING
|
v
[Real / Valid?]
|
v
[Affected in our build / runtime?]
|
v
[Where is it deployed?]
|
v
[Who can reach it?]
|
v
[Is the vulnerable path reachable?]
|
v
[Possible -> Feasible -> Weaponized -> Active?]
|
v
[What identity / privileges does compromise give?]
|
v
[What can the attacker reach next?]
|
v
[Business impact / blast radius]
|
v
[Which control can break the path now?]
|
v
[Priority -> Treatment -> Owner -> SLA / Expiry]
|
v
[Verify -> Reassess -> Reopen if assumptions change]
Это не checklist. Это короткая модель мышления (т.е. ты можешь ее адаптировать под свой стек\архитектуру\продукт). Если на одном из шагов нет ответа, то просто пишем Unknown, а не автоматически превращаем неизвестность в Low risk.
Еще один полезный operational signal из реальной работы — age / time at risk: сколько finding уже живёт в production и сколько времени актив остается под экспозицией. Возраст проблемы\бага сам по себе не превращает Medium в Critical, но помогает управлять очередью, метриками SLA breaches и накопленным security debt (что очень важно для Lead и Head).
Почему классическая модель «CVSS = Priority» больше не работает
Модель старой школы (лет так 10 назад) выглядела просто:
Scanner -> CVE -> CVSS -> SLA -> Patch
Например:
CVSS 9.0-10.0 -> Critical -> fix in 24/48h
CVSS 7.0-8.9 -> High -> fix in 7 days
CVSS 4.0-6.9 -> Medium -> fix in 30 days
CVSS < 4.0 -> Low -> backlog
Для отчетности это красиво. Для реальной Product Security — слишком грубо, не качественно. Нужен экспертный взгляд, парсинг профессионала.
Метода FIRST в актуальном CVSS v4.0 прямо подчёркивает, что CVSS-B измеряет severity, а не risk. В версии 4.0 (актуальна на на момент написания материала) появились отдельные Base, Threat, Environmental и Supplemental metrics, и сама модель фактически говорит потребителю: Base Score — это только начало анализа.
То есть даже стандарт, который часто ошибочно используют как готовый risk score, говорит обратное.
Смотрим практический пример:
- CVSS 9.8 в library, которую приложение физически не вызывает, может быть ниже по operational priority;
- CVSS 6.5 на internet-facing API, который позволяет cross-tenant data exposure, может быть для бизнеса гораздо опаснее;
- CVSS 8.x на внутреннем CI/CD controller может стать P0, если через него доступны signing keys, registry, production deploy tokens и Kubernetes;
- CVSS 10.0 на package, которого нет в runtime artifact, вообще может оказаться false positive или
not_affectedдля данного продукта.
Поэтому предпочитаю мыслить вот так:
Priority = f(
Technical Severity,
Applicability,
Exposure,
Reachability,
Exploitability,
Threat Intelligence,
Asset Criticality,
Blast Radius,
Compensating Controls,
Business Impact,
Confidence
)
Это не математическая формула и не предложение умножать один subjective score на другой. Это скорее список вопросов, которые инженер должен пройти до того, как назвать vulnerability «Critical для нас\продукта».
Полевая терминология
Если вы только входите в Product Security, то часть терминов сначала звучит как корпоративная магия. На практике они довольно конкретны. Ценим ниже, разбираем по косточкам.
| Термин | Что это означает в работе |
|---|---|
| Finding | Любой security signal: CVE, SAST finding, DAST issue, misconfiguration, pentest finding, bug bounty report |
| CVE | Идентификатор публично раскрытой vulnerability |
| CWE | Класс слабости: SSRF, path traversal, auth bypass, deserialization и т.д. |
| CVSS | Стандартизированная оценка технической severity |
| SCA | Software Composition Analysis — поиск vulnerable third-party dependencies |
| SAST | Static Application Security Testing — анализ исходников/IR без запуска приложения |
| DAST | Dynamic Application Security Testing — тестирование работающего приложения |
| SBOM | Software Bill of Materials — inventory компонентов продукта |
| VEX | Vulnerability Exploitability eXchange — machine-readable statement о применимости/эксплуатируемости vulnerability в конкретном продукте |
| EPSS | Вероятность наблюдаемой эксплуатации CVE в ближайшие 30 дней по модели FIRST |
| KEV | CISA Known Exploited Vulnerabilities — каталог уязвимостей с подтверждённой эксплуатацией in the wild |
| PoC | Proof of Concept exploit; доказательство, что primitive действительно работает |
| Pre-auth / unauth | Эксплуатация до аутентификации / без учётной записи |
| Exposure | Насколько система доступна атакующему: Internet, partner, VPN, internal, namespace-local и т.д. |
| Reachability | Может ли attacker-controlled flow дойти до vulnerable code/function/sink |
| Entry point | Точка входа: HTTP route, message queue consumer, CLI, file parser, RPC method, webhook и т.д. |
| Sink | Опасная операция: command execution, SQL query, deserialization, file write, SSRF request и т.д. |
| Source-to-sink | Поток данных от attacker-controlled input к dangerous sink |
| Call graph | Граф вызовов функций, полезный для code-level reachability |
| Taint flow | Анализ распространения недоверенных данных по коду |
| Attack path | Реальная цепочка от точки входа до security impact |
| Exploit chain | Несколько primitives/vulnerabilities, объединённых в один attack scenario |
| Blast radius | Масштаб последствий после успешной compromise |
| Pivot / lateral movement | Переход с одного скомпрометированного узла к другим системам |
| Crown jewel | Актив с непропорционально высокой ценностью: CI/CD, IAM, secrets manager, signing infrastructure, production control plane |
| Compensating control | Контроль, который реально ломает attack path или снижает impact, когда прямой fix пока невозможен |
| Residual risk | Риск, остающийся после mitigation |
| Risk acceptance / exception | Формальное временное принятие residual risk с owner, rationale и expiry date |
| SLA | Срок remediation, согласованный по классу риска |
| ASPM | Application Security Posture Management — агрегация и корреляция AppSec signals |
| CNAPP / CSPM | Cloud-native / cloud security posture tooling, где findings уже приходят с cloud context |
Mindset инженера: не «закрыть CVE», а доказать (бизнес) риск
Когда я разбирал vulnerability, я старался не начинать с фразы:
«У нас Critical». «Нужен фикс от разрабов, включаем тикет в спринт»
Я начинал с другого, а точнее спрашивал себя и коллег по SecOps:
«Что именно должно произойти, чтобы attacker превратил этот finding в реальный impact?»
Это резко меняет качество анализа. Вместо красной карточки в scanner dashboard появляется attack story:
Actor
-> Entry point
-> Trust boundary
-> Vulnerable component/function
-> Required privileges/configuration
-> Exploit primitive
-> Initial impact
-> Pivot
-> Crown jewel / data / production
-> Business consequence
Если я не мог хотя бы приблизительно построить эту цепочку, значит triage ещё не закончен. И надо парсить дальше, искать доп инфу, консультироваться, а сейчас даже перетереть это с ИИ:)
Восемь вопросов, которые я задаю до назначения priority
1. Finding настоящий?
Сначала sanity check:
- правильный ли package/version;
- не stale ли SBOM;
- не false positive ли fingerprint;
- попадает ли binary/image, который реально деплоится, под affected range;
- совпадает ли OS/distro/build;
- не vendor-patched ли package при старом upstream version string;
- присутствует ли component только в build stage, но не в runtime image.
Это applicability.
Плохой triage начинается, когда команда тратит два дня на CVE, которого в production artifact вообще нет.
2. Где этот компонент живёт (слой, сегмент, сервис)?
Дальше нужен deployment context.
Например:
repo -> build -> image -> registry -> Kubernetes -> pod -> service -> route
Нужно понимать про:
- dev / test / staging / prod;
- public или internal;
- tenant-facing или back-office;
- container, VM, serverless, bare metal;
- ephemeral worker или long-lived controller;
- есть ли state, secrets, customer data;
- какие identities/service accounts привязаны к workload.
Слово asset criticality начинается именно здесь. Да, мэн, держать четкую карту продукта\инфраструктуры в голове.
3. Есть ли exposure?
Exposure — это не только «торчит ли порт 443 в Интернет».
Вот полезная шкала оценки в процессе рассуждения:
Internet unauthenticated
↓
Internet authenticated
↓
Partner / customer private network
↓
VPN / corporate network
↓
Internal service-to-service
↓
Namespace / host local
↓
Offline / build-only
Иногда internal system опаснее public endpoint, потому что у него намного больше downstream privileges. Например, Jenkins может быть доступен только через VPN, но иметь:
- GitLab token;
- kubeconfig;
- registry credentials;
- AWS role;
- artifact signing key.
В таком случае «internal only» — не аргумент для автоматического downgrade. Можно найти решение гибче.
4. Reachable ли vulnerable path?
ЗАПОМНИ: Package presence не равна exploitability. Это аксиома. Нужно уметь отличать несколько уровней доказательства. Юзаем шпаргалку ниже.
Лестница reachability evidence
| Уровень | Evidence | Что мы реально знаем |
|---|---|---|
| L0 — Presence | package/version есть в SBOM | компонент присутствует |
| L1 — Imported/Linked | код импортирует package | dependency реально используется где-то в приложении |
| L2 — Function reachability | call graph ведёт к affected symbol | vulnerable function может быть вызвана |
| L3 — Source-to-sink | taint/data-flow от attacker input к vulnerable sink | controlled data может достичь опасной операции |
| L4 — Route/exposure | entry point опубликован и reachable через trust boundaries | attacker может инициировать этот flow |
| L5 — Runtime evidence | tracing/coverage/eBPF/telemetry подтверждает execution path | path реально исполнялся в deployment |
Чем выше уровень evidence, тем сильнее вывод. Но важно и обратное: отсутствие статического path не всегда доказывает невозможность эксплуатации. Reflection, dynamic loading, plugin systems, native calls, dependency internals, runtime code generation могут ломать простые call graph assumptions.
Поэтому хороший verdict инженера выглядит не так:
NOT REACHABLE = SAFE
а больше вот так:
No reachable path found with current evidence; confidence: Medium. Reassess if feature/config/runtime changes.
Из open-source tooling хороший пример такого подхода — OSV-Scanner с call analysis: он умеет отделять vulnerabilities в вызываемом коде от package findings, где affected code path не обнаружен. OWASP dep-scan также развивает reachability-aware prioritization и VEX output.
5. Насколько exploit weaponizable?
Technical severity отвечает не на всё. Это тоже аксиома. Запомни это.
Поэтому я смотрю на еще и:
- есть ли public PoC;
- есть ли functional exploit;
- насколько exploit stable;
- нужен ли rare prerequisite;
- pre-auth ли это;
- можно ли автоматизировать массовый scanning;
- попал ли CVE в CISA KEV;
- какой EPSS probability и percentile;
- есть ли vendor warning об active exploitation;
- есть ли exploitation в threat reports.
EPSS: probability != percentile
Здесь есть одна ловушка, на которой регулярно спотыкаются даже люди, уже работающие с vulnerability data. Эти два термина похоже, но сука, по разному воспринимаются м путать их НИ-Ни!
EPSS probability и EPSS percentile — не одно и то же.
-
Probability — абсолютная модельная вероятность наблюдаемой эксплуатации CVE в ближайшие 30 дней. Значение
0.10означает примерно 10%, а не «низкий балл 0.1 из 10». -
Percentile — относительный rank этой probability среди всех CVE, для которых FIRST публикует EPSS. Например,
percentile = 0.95означает, что score выше примерно 95% текущей популяции, а не 95% вероятность эксплуатации.
Из-за того что большая часть CVE никогда не наблюдается в реальной эксплуатации, distribution сильно смещён к нулю. Поэтому даже на первый взгляд небольшая probability может находиться очень высоко по percentile.
Я обычно сохраняю оба значения вместе:
EPSS probability: 0.10 (10%)
EPSS percentile: 0.95 (95th percentile)
EPSS checked_at: YYYY-MM-DD
checked_at полезен потому, что EPSS обновляется ежедневно: threat signal — не статический атрибут CVE.
И еще одно важное правило: не надо умножать EPSS на CVSS и называть результат risk score. EPSS — калиброванная probability, а CVSS Base — severity model. Такое перемножение создаёт красивое число без понятной статистической интерпретации — FIRST прямо относит подобную практику к misuse.
Здесь полезно различать:
Possible — теоретически возможно.
Feasible — практически реализуемо.
Weaponized — есть готовый exploit / tooling.
Active — уже эксплуатируется in the wild.
Эти состояния требуют разного operational response. Но это уже несколько другая тема и выхолит за скоуп статьи.
6. Что получит attacker после первого шага?
Это вопрос про privilege context. Например, RCE в pod не всегда равно cluster compromise.
Нужно проверить:
- UID/root/non-root;
- privileged container;
- Linux capabilities;
- hostNetwork / hostPID / hostPath;
- service account token;
- Kubernetes RBAC;
- cloud IAM role;
- mounted secrets;
- access to metadata service;
- outbound egress;
- access to control plane;
- registry permissions;
- CI/CD secrets.
Один и тот же RCE, который:
RCE in isolated non-root pod
и который:
RCE in privileged deployment controller with cluster-admin
— два разных бизнес-события. Вот тут то видно кто Jun, кто Mid, а кто скиловый прошедший огонь и воду Senior:)
7. Какой blast radius?
После initial access я мысленно спрашиваю себя:
«Что attacker сможет сделать следующим?»
Ценим пример:
Internet
|
v
[Nginx]
|
v
[API Pod]
|
+--> service account
|
+--> internal DB
|
+--> internal admin API
|
+--> container registry
|
+--> secrets
Если vulnerability дает только локальный DoS одного stateless replica — один риск. Если она открывает путь к:
- cross-tenant data;
- production secrets;
- signing keys;
- build system;
- registry write;
- IAM privilege escalation;
- production deployments;
- customer PII;
ТО приоритет резко РАСТЕТ. Это и есть blast radius analysis.
8. Как быстрее всего разорвать attack path?
Здесь важный инженерный shift у себя в мозгу: remediation не равно patch. Patch — это , да, отличный вариант, но не единственный.
Иногда самый быстрый risk reduction:
- отключить feature flag;
- закрыть route;
- убрать Internet exposure;
- выключить CLI;
- применить WAF/gateway rule;
- заблокировать egress;
- deny access к metadata;
- урезать IAM/RBAC;
- убрать secret mount;
- изолировать namespace;
- rollbackнуть component;
- удалить vulnerable package;
- rotate credentials;
- поставить vendor hotfix;
- временно вывести node/service из эксплуатации.
А потом спокойно сделать permanent fix. Именно поэтому хороший Security Engineer влияет не только на что чинить, как закинуть таск в спринт, но и на как уменьшить risk прямо сейчас.
Полный processing chain: как finding превращается в решение
Ниже — pipeline, который я бы дал junior engineer как рабочую карту.
[SCA / SAST / DAST / CNAPP / Pentest / Bug Bounty / Vendor Advisory]
|
v
1. Intake / Normalize
|
v
2. Validate / Dedupe
|
v
3. Applicability
|
v
4. Exposure / Reachability
|
v
5. Exploitability / Threat Intel
|
v
6. Asset / Identity / Blast Radius
|
v
7. Business Impact
|
v
8. Compensating Controls
|
v
9. Priority Decision
|
v
10. Treatment / Ownership
|
v
11. Fix Verification
|
v
12. Evidence / Exception / Recheck
Теперь разберём, что происходит на каждом шаге. По сути, тебе можно держать эту табличку как шпаргалку
| Этап | Главный вопрос | Типичный output |
|---|---|---|
| Intake | откуда пришёл signal? | finding ID, source, asset |
| Validate | finding реальный и уникальный? | confirmed / duplicate / false positive |
| Applicability | affected ли наш version/build/runtime? | affected / not affected / unknown |
| Exposure | кто может достучаться? | Internet / auth / VPN / internal |
| Reachability | можно ли дойти до affected path? | call path / route / taint evidence |
| Exploitability | насколько реально exploit сделать сейчас? | PoC, EPSS, KEV, active exploitation |
| Blast radius | что будет после compromise? | identities, secrets, downstream systems |
| Business impact | что теряет бизнес? | data, money, uptime, compliance, trust |
| Controls | что ломает цепочку? | WAF, segmentation, IAM, disabled feature |
| Priority | насколько срочно действовать? | P0/P1/P2/P3 или Critical/High/Medium/Low |
| Treatment | что делаем? | patch, mitigate, contain, accept, avoid |
| Verification | риск действительно уменьшился? | retest / scan / telemetry evidence |
| Recheck | что может сделать решение невалидным? | expiry, reopen triggers |
Как выглядит хороший triage ticket
Один из лучших навыков Senior Engineer — уметь превратить шумный scanner output в короткий decision-ready record.
Я бы использовал примерно такой шаблон:
Finding ID:
Source: SCA / SAST / DAST / Pentest / Vendor / Bug Bounty
Asset / Service:
Environment: prod / staging / dev
Owner:
CVE / CWE:
Affected component + version:
CVSS-B / vector:
EPSS probability / percentile:
CISA KEV: yes/no
Public PoC: yes/no/unknown
Active exploitation: yes/no/unknown
Exposure:
Authentication required:
Entry point:
Reachability evidence:
Exploit prerequisites:
Assessment confidence: High / Medium / Low
Runtime identity:
IAM / RBAC context:
Secrets available:
Downstream systems:
Blast radius:
Data classification:
Existing controls:
Control verification evidence:
Residual risk:
Final priority:
Recommended treatment:
Security owner:
Engineering owner:
Due date / SLA:
Exception expiry:
Reopen triggers:
Сравни два handoff’а. И ты поймешь в чем разница:)
Плохой ответ
Critical CVE 9.8. Please patch ASAP.
Хороший ответ
CVE-Xприсутствует в production imageorders-api:v312. Package affected, но vulnerable XML import function не reachable из published routes; feature disabled, call graph path отсутствует, runtime trace не показывает загрузку parser. Internet exposure сервиса есть, но affected route отсутствует. CVE не в KEV; public exploit не обнаружен. Impact при гипотетическом exploit высокий из-за customer data. Priority: P2. Upgrade dependency в ближайшем release train; VEXnot_affected/code_not_reachableс expiry 30 дней. Reopen при включении import feature, появлении KEV/working exploit или изменении route table.
Второй вариант позволяет Tech Lead принять решение. Первый — работает либо Jun либо олух. Либо происходит что-то еще:) но не очень хорошее:))
Severity, Risk и Priority — не путайте эти слова
Это одна из самых частых проблем на интервью и в реальной работе.
Severity
Насколько тяжёлым может быть technical impact vulnerability. Обычно здесь CVSS.
Risk
Комбинация likelihood + impact в конкретном контексте организации.
Priority
Насколько быстро мы должны действовать относительно других задач, рисков и ресурсов.
Можно иметь:
High Severity + Low Reachability + Strong Controls = Medium Priority
или:
Medium Severity + Internet Exposure + High Exploitability + Crown Jewel Impact = Critical Priority
И это не противоречие. Это нормальная risk-based prioritization.
Risk Priority != Remediation Difficulty
Это Lead-level нюанс, который очень легко потерять, когда security и engineering начинают спорить о сроках.
То, что vulnerability сложно исправить, не делает её менее рискованной. Сложность fix влияет на treatment plan, но не должна задним числом переписывать assessment.
Я стараюсь держать отдельно минимум пять осей:
| Ось | На какой вопрос отвечает |
|---|---|
| Risk / Priority | Насколько опасно и насколько срочно нужно снизить exposure? |
| Engineering effort | Сколько работы требует permanent fix? |
| Change / availability risk | Может ли remediation сломать production, вызвать regression или downtime? |
| Fix availability | Есть ли patch/upgrade/hotfix или нужен собственный redesign? |
| Time at risk | Как долго актив уже остаётся под этим риском? |
Это даёт гораздо более честную decision model:
| Low remediation effort | High remediation effort / change risk | |
|---|---|---|
| High risk / high priority | Fix now. Это идеальный P0/P1 quick win. | Contain now, engineer the permanent fix next. Remove exposure, disable feature, reduce privilege, isolate, add a verified control, then patch/redesign safely. |
| Lower risk / lower priority | Take the quick win если это почти бесплатно и не создаёт regression. | Plan, accept temporarily, or redesign с owner, rationale, expiry и reopen triggers. |
Самая опасная ошибка выглядит так:
“Да, это P0, но patch сложный, поэтому давайте назовём finding Medium.”
Нет. Если risk действительно P0, он остаётся P0. Просто immediate response может быть не patch, а containment / mitigation, который быстро разрывает attack path, пока engineering готовит безопасный permanent fix.
И обратная сторона тоже важна: дешёвый fix не обязан автоматически становиться P0. Его можно сделать как quick win, но remediation convenience не является measure of risk.
Смог это объяснить на тех интервью!? Поздравляю, мен, +15% к базовой ставке оффера!
Практическая decision matrix
Я не люблю псевдоточность вида Risk Score = 8.736 из десяти субъективных коэффициентов. Что б**ть за цифры, мы же люди, не машины, говорить нужно понятно. Для инженерной коммуникации часто лучше прозрачная qualitative matrix. Вот она, цени ниже.
| Signal | Low | Medium | High | Critical signal |
|---|---|---|---|---|
| Severity | limited impact | material impact | major C/I/A | RCE, auth bypass, systemic compromise |
| Exposure | offline/local | internal | customer/partner reachable | Internet unauthenticated |
| Reachability | proven unreachable | uncertain | static reachable | input-to-sink / runtime confirmed |
| Exploit maturity | theoretical | PoC with constraints | functional exploit | KEV / active exploitation |
| Asset criticality | disposable | internal supporting | important production | IAM, CI/CD, secrets, control plane |
| Blast radius | isolated | one service | several systems/data | supply chain / cross-tenant / org-wide |
| Controls | strong verified | partial | weak | absent/bypassable |
| Confidence | low evidence | mixed | strong | multiple independent evidence sources |
Я бы затем переводил это в operational class. Разберем их ниже.
P0 / Critical
Типичный профиль:
- Internet-facing или easy lateral reach;
- pre-auth / unauth;
- reachable vulnerable path;
- KEV / active exploitation / reliable weaponized exploit;
- crown-jewel asset;
- большой blast radius;
- controls отсутствуют или обходятся.
Action: containment сейчас, remediation emergency lane, incident-assumption при необходимости, credential rotation, IOC review.
P1 / High
- exploit path реален;
- asset важный;
- exploitation feasible;
- impact высокий;
- есть частичный mitigation или active exploitation пока не подтверждена.
Action: expedited fix, short SLA, named owner, tracking до closure.
P2 / Medium
- vulnerability применима;
- требует authentication/config/prerequisite;
- blast radius ограничен;
- controls действительно работают.
Action: normal release cycle с конкретной датой.
P3 / Low / Temporarily Accepted
- component присутствует, но affected function недостижима с хорошим evidence;
- feature отключена;
- required configuration отсутствует;
- exposure минимален;
- compensating controls подтверждены.
Action: документированный exception/risk acceptance, owner, expiry и reopen conditions.
Risk acceptance без срока пересмотра — это не risk management. Это архивирование проблемы.
Где здесь CVSS v4, EPSS, KEV, SSVC и VEX и как, с*ка это все запомнить
Эти инструменты не конкурируют. Они отвечают на разные вопросы. Если забыл про один, но помнишь два других - ОК. Важно не столько "помнить" сколько "понимать", никто не запрещает юзать шпоры) Да же я когда преподавал в универе, то разрешал ребятам на экзамене использовать конспекты
| Framework / Signal | На какой вопрос отвечает |
|---|---|
| CVSS-B | насколько vulnerability тяжёлая технически сама по себе? |
| CVSS Threat metrics | как меняется threat state / exploit maturity? |
| CVSS Environmental | как deployment и importance системы меняют severity context? |
| EPSS | какова модельная вероятность observed exploitation в ближайшие 30 дней? |
| CISA KEV | есть ли подтверждённая exploitation in the wild? |
| SSVC | какое response decision принять через decision tree? |
| VEX | affected ли конкретный product и как формально передать exploitability status? |
CISA SSVC особенно полезен как mindset: вместо «score worship» он использует decision tree и учитывает состояние эксплуатации и impact. В модели CISA возможны outcomes вроде Track, Track*, Attend, Act.
Я не предлагаю копировать SSVC один в один в любую компанию. Но сама идея очень правильная: цель assessment — не получить красивое число, а принять response decision.
Кейс 1: CVSS 9.8, но attack path отсутствует
Представим production platform. Анонимно, детали под NDA, но суть сохранена.
Internet
|
v
[Cloud LB]
|
v
[Nginx Ingress]
|
v
[Istio Gateway]
|
v
+-------------------+
| orders-api Pod |
| app + sidecar |
+-------------------+
| |
v v
[PostgreSQL] [Kafka/MQ]
CI/CD:
Developer -> GitLab -> Jenkins -> Registry -> Kubernetes
SCA находит vulnerable XML parsing dependency с CVSS 9.8. Scanner dashboard становится красным. Формальный SLA говорит «Critical».
Что делает inexperienced engineer
Создаёт Jira:
Upgrade immediately. CVSS 9.8.
Что делает Senior Product Security Engineer
Проверяет applicability и path.
- Package действительно есть в runtime image.
- Affected function используется только модулем legacy XML import.
- Feature flag
xml_import=falseв production. - Route для import отсутствует в Nginx/Istio config.
- Static call graph не находит path от HTTP handlers к affected parser.
- Runtime tracing не показывает загрузку этого parser за наблюдаемый период.
- NetworkPolicy не является главным justification, но дополнительно ограничивает lateral path.
- Нет KEV / active exploitation signal, который бы заставил пересмотреть conservative assumptions.
Reachability verdict
Package present: YES
Affected version: YES
Imported: YES
Affected function: NOT REACHED by current static evidence
Published route: NO
Feature enabled: NO
Runtime observed path: NO
Confidence: MEDIUM-HIGH
Решение
Technical severity остаётся Critical.
Operational priority может стать P2, потому что текущий deployed product не предоставляет attacker path к affected function.
Но я бы не делал close and forget.
Я бы сделал:
- upgrade dependency в ближайшем release train;
- VEX statement
not_affectedс justification типаcode_not_reachable, если ваша схема VEX это поддерживает; - приложил evidence;
- назначил expiry;
- добавил reopen triggers.
Например:
Reopen if:
- XML import feature enabled;
- route published;
- dependency behavior changes;
- working exploit changes assumptions;
- CVE enters KEV;
- architecture / call path changes.
Урок: мы не «проигнорировали Critical». Мы доказали текущую неэксплуатируемость с заданным confidence и поставили автоматические условия пересмотра.
Кейс 2: формально «не RCE», но priority становится Critical
Теперь противоположный пример. Ценим, мотаем на ус:)
Internet
|
v
[CDN / WAF]
|
v
[Nginx Ingress]
|
v
[image-preview API]
|
| outbound fetch
v
[internal/cloud endpoints]
|
+--> metadata / workload identity (if reachable)
+--> internal admin services
+--> storage
+--> registry
В функции preview обнаружен SSRF.
Первое впечатление:
- прямого RCE нет;
- endpoint «всего лишь качает картинку»;
- scanner может присвоить Medium/High;
- команда хочет положить issue в обычный backlog.
Теперь context review.
Exposure
- endpoint Internet-facing;
- account не требуется;
- requests легко автоматизировать.
Reachability
- attacker controls URL;
- URL попадает в outbound HTTP client;
- egress unrestricted;
- allowlist отсутствует.
Identity context
Workload имеет cloud identity и доступ к internal resources.
Blast radius
Успешный SSRF потенциально превращается в:
Internet actor
-> SSRF primitive
-> internal/cloud endpoint access
-> credentials / internal service access
-> data or registry compromise
Что делать
Патчить код нужно. Но fast containment может быть быстрее:
- disable preview feature;
- outbound allowlist;
- block link-local/metadata destinations;
- egress NetworkPolicy;
- reduce workload IAM;
- separate fetcher into isolated workload;
- require auth/rate limits если это соответствует продукту;
- затем permanent code fix.
Итог
Technical severity: Medium/High
Internet exposure: Critical signal
Reachability: Confirmed
Exploit automation: High
Business impact: High/Critical
Controls: Weak
Priority: P0/P1
Урок: отсутствие RCE не делает vulnerability «некритичной». В Product Security важен exploit chain, а не название CWE.
Кейс 3: TeamCity CVE-2023-42793 — когда почти все сигналы смотрят в одну сторону
Теперь реальный пример. Можешь сам погуглить:)
В 2023 году вендор JetBrains раскрыл CVE-2023-42793 в TeamCity On-Premises. Vendor описал scenario, при котором unauthenticated attacker с HTTP(S) access мог получить RCE и административный контроль TeamCity server. JetBrains выпустила исправление в 2023.05.4 и patch plugin для старых версий. Херовая бага... для них:) И сейчас поймешь почему.
Позже JetBrains сообщила о наблюдаемой эксплуатации, включая активность nation-state actors. CISA добавила CVE в KEV.
Представим enterprise deployment:
Internet / Corp Network
|
v
[TeamCity Server]
|
+----> GitLab repos
|
+----> Build agents
|
+----> Docker Registry
|
+----> Artifact repository
|
+----> Kubernetes deploy token
|
+----> Cloud secrets / IAM
Здесь contextual signals:
- Severity: Critical;
- Exposure: если public — Critical; если internal — всё равно material;
- Reachability: direct HTTP(S);
- Auth requirement: pre-auth/unauth в vulnerable scenario;
- Threat intel: active exploitation;
- KEV: yes;
- Asset criticality: CI/CD crown jewel;
- Blast radius: source + artifacts + deployments + secrets;
- Supply-chain impact: возможен downstream compromise.
В этот момент спор «9.8 или 10.0?» практически бесполезен.
Хороший response
- Contain — убрать public exposure/ограничить access, если patch не мгновенный.
- Patch/upgrade — применить vendor fix.
- Hunt — проверить IOCs, логи, abnormal behavior.
- Assume credential exposure where justified — оценить, какие secrets были доступны TeamCity.
- Rotate — deployment tokens, registry creds, cloud credentials при необходимости.
- Inspect downstream — build agents, artifacts, releases.
- Restore — только после проверки.
Урок: mature vulnerability management иногда должен перейти из обычного remediation в incident-response mode.
Ещё три коротких real-world anchor’а
Jenkins CVE-2024-23897
Jenkins описал arbitrary file read через CLI, который в определённых условиях мог приводить к более серьёзным последствиям, включая RCE scenarios. Vendor отдельно описал prerequisites и workaround: временное отключение CLI могло предотвратить exploitation до upgrade.
Что это хорошо показывает:
- название finding’а «file read» может недооценивать downstream impact;
- prerequisites важны;
- configuration и encoding могли влиять на практическую exploitability;
- temporary mitigation может быть правильным first response, пока идёт patching.
XZ Utils CVE-2024-3094
XZ backdoor показал другую сторону contextual analysis: громкое событие не означает, что every Linux host одинаково affected.
Нужно было выяснять:
- exact version;
- distro/build;
- package provenance;
- runtime interaction;
- присутствует ли malicious build в конкретной системе.
Red Hat, например, отдельно указывала affected Fedora builds и то, что RHEL не был затронут.
Урок: inventory + provenance + applicability могут быть важнее самой headline severity.
HTTP/2 Rapid Reset CVE-2023-44487
Для public high-volume edge сервисов availability issue может быть P0, даже если речь не идёт о code execution или data theft.
Урок: CIA impact должен оцениваться относительно business function. Availability иногда важнее Confidentiality.
Compensating controls: не верьте архитектурной диаграмме на слово
Одна из самых опасных фраз на triage call:
«У нас же WAF».
Хорошо. Какой rule? Какой exploit primitive он блокирует? Проверяли ли bypass? На каком edge? Доходит ли traffic в обход него? Есть ли alternate route?
То же самое с:
- NetworkPolicy;
- service mesh authz;
- VPN;
- MFA;
- EDR;
- runtime protection;
- least privilege;
- egress deny;
- secret isolation.
Compensating control должен быть связан с attack path. Иначе, простите, это Г**но, а не контроль:))
Например:
Attacker
|
v
[Ingress]
|
v
[API Pod]
|
+------X------> Metadata
|
egress deny
VERIFIED
Здесь control действительно ломает конкретный edge в attack graph. А запись «WAF enabled» без proof — почти ничего не значит.
Что значит «влиять на решение» как Senior Engineer
Когда я говорю, что инженер должен влиять на решение, я не имею в виду, что Security единолично решает судьбу релиза. Хорошая модель выглядит так:
Security приносит описание\расшифровку
- exploit mechanics;
- reachability evidence;
- threat intel;
- likely attack path;
- blast radius;
- mitigation options;
- residual risk.
Engineering (DEV) приносит
- implementation reality;
- release constraints;
- regression risk;
- patch complexity;
- feature dependencies.
Product / Business owner приносит
- customer impact;
- contractual commitments;
- revenue/availability context;
- acceptable downtime;
- risk appetite.
Leadership принимает или делегирует decision
- fix now;
- ship with mitigation;
- feature off;
- rollback;
- emergency maintenance;
- documented exception;
- accept residual risk.
Security Engineer здесь — decision enabler, а не человек, который только генерирует "красные тикеты". Короче, хоть грейд у него и ниже, а ЗП меньше чем у Head, без его оценки никуда, без его работы никак!
Risk treatment: у вас больше вариантов, чем «patch / no patch»
В NIST risk management обычно встречаются базовые стратегии: mitigate, avoid, transfer, accept. В vulnerability workflow их можно перевести в более инженерный язык.
| Treatment | Пример |
|---|---|
| Remediate | upgrade/fix code |
| Mitigate | WAF rule, egress block, auth requirement |
| Contain | isolate host, remove Internet exposure |
| Avoid | disable/remove vulnerable feature |
| Reduce privilege | IAM/RBAC hardening, remove secrets |
| Detect | compensating monitoring/alerting while patch is pending |
| Rollback | return to safe version |
| Rotate | invalidate potentially exposed creds |
| Accept temporarily | documented exception with expiry |
| Redesign | architectural change to eliminate class of risk |
Очень важно: mitigation должен снижать either likelihood or impact. Если он не меняет attack path и не уменьшает последствия — это не mitigation, а чувство безопасности.
Кто участвует в assessment
Хороший triage редко делается одним человеком. Это вероятно только для очень не зрелых команд и маленктих компаний\стартапов.
| Роль | Что она знает лучше других |
|---|---|
| Product Security / AppSec | vulnerability mechanics, code path, abuse case |
| Senior Developer | actual implementation, feature flags, call paths |
| Platform / Cloud Security | IAM, network, Kubernetes, cloud controls |
| SRE / Infra | deployment reality, topology, operational impact |
| Service Owner | customer/business criticality |
| Threat Intel / SOC | exploitation activity, IOCs, campaigns |
| Security Lead | risk appetite, exceptions, cross-team priority |
Зрелость (mature) — это не когда Security знает все и может процитировать на память. Зрелость — когда процесс быстро собирает нужный context у правильных владельцев. Дальше это все коллегиально обсуждается, принимается общее решение основанное на фактах, верстается оно в action plan. И далее раздается на уровни ниже для реализации (Sec, Dev, Ops, QA, etc)
Три уровня мышления: Junior, Senior, Lead
Если вы Junior / кандидат, новичок
Ваша цель — научиться не верить одному scanner output.
Минимальный набор:
- понять CVE/CWE;
- найти affected version;
- определить asset;
- проверить exposure;
- понять auth/prerequisites;
- проверить PoC/KEV/EPSS;
- поговорить с developer о code path;
- описать impact;
- предложить remediation + mitigation.
Если вы это умеете, вы уже мыслите намного ближе к Product Security Engineer, чем человек, который просто сортирует CVEs по CVSS.
Если вы Senior Engineer
От вас ждут:
- ownership triage;
- attack-path reasoning;
- confidence-based conclusions;
- хорошую коммуникацию с dev/platform;
- business translation;
- viable treatment options;
- verification after fix;
- правильный exception process.
Senior не просто говорит «все плохо или все норм». Senior говорит:
«Вот path, вот evidence, вот impact, вот три способа снизить risk, вот самый дешёвый по времени, вот residual risk.»
Если вы Tech Lead / Security Lead
Вопрос уже не только про один finding. Нужно построить систему:
- common triage rubric;
- risk taxonomy;
- ownership model;
- SLAs;
- exception workflow;
- KEV/EPSS enrichment;
- SBOM/VEX integration;
- duplicate suppression;
- re-open triggers;
- metrics качества.
Полезные lead-level metrics:
- MTTR по risk class, а не просто CVSS;
- age of reachable Critical/High findings;
- KEV exposure time;
- Internet-exposed exploitable findings;
- exceptions past expiry;
- percentage findings with confirmed owner;
- false-positive/duplicate rate;
- percentage SCA findings с reachability evidence;
- time from finding to containment;
- recurrence rate по CWE/root cause.
Это уже vulnerability management как engineering system, а не spreadsheet. Вообщем, здесь уже меньше технарьщины и больше про outcomes.
Рекомендации для молодого инженера
Если завтра получил finding, не спеши говорить «Critical». Пройдите этот mini-checklist:
[ ] Is it real?
[ ] Are we affected?
[ ] Where is it deployed?
[ ] Who can reach it?
[ ] Can input reach the vulnerable sink?
[ ] Is there a PoC / EPSS / KEV signal?
[ ] What identity/privileges does the workload have?
[ ] What can attacker reach next?
[ ] What is the business impact?
[ ] Which controls actually break the path?
[ ] What is the fastest safe treatment?
[ ] Who owns it and when do we recheck?
Если можешь ответить на эти вопросы — то уже есть основа для defensible risk decision. Иначе искать доп материал, парсить и\или качать профессиоанльный скилл.
Как ответить на интервью: «How do you prioritize vulnerabilities?»
Короткий хороший ответ на уровне Product Security:
«Я не использую CVSS как единственный priority signal. Сначала подтверждаю applicability и deployment context, затем смотрю exposure и reachability до vulnerable function, после этого добавляю exploit intelligence — EPSS, KEV, public PoC и active exploitation. Дальше оцениваю asset criticality, runtime identity, blast radius и business impact, проверяю compensating controls и только потом назначаю remediation priority. Для меня главное — построить attack path и выбрать response, который быстрее всего снижает residual risk: patch, isolation, feature disablement, IAM reduction или временный documented exception.»
Если кандидат отвечает примерно так — я понимаю, что он уже мыслит не scanner’ом, а risk system. И это Mid как минимум, а то и Mid+ or Senior. Больше скилл = больше экспертизы = больше ответственности = больше salary:)
Что автоматизировать, а что оставить человеку
Автоматизация (ИИ в том числе) отлично справляется с:
- inventory;
- SCA/CVE matching;
- CVSS enrichment;
- EPSS;
- KEV flags;
- Internet exposure signals;
- cloud asset metadata;
- basic reachability;
- duplicate correlation;
- SLA routing.
Человек всё ещё нужен для:
- business impact;
- strange architecture;
- dynamic code paths;
- exploit-chain reasoning;
- control validation;
- exception justification;
- trade-off между risk и delivery;
- confidence assessment.
Поэтому ASPM/CNAPP/SCA evolution идёт в сторону context correlation, но полностью «автоматический risk score» всё ещё нужно воспринимать осторожно.
Типовые ошибки\заблуждения, которые могут сэконоить время
Ошибка 1. CVSS = риск
Нет. Это severity input.
Ошибка 2. Package present = vulnerable path reachable
Нет. Нужен applicability/reachability analysis.
Ошибка 3. Internal = safe
Нет. Internal crown jewel может быть опаснее edge service.
Ошибка 4. Есть WAF = mitigated
Только если конкретный rule действительно ломает exploit primitive.
Ошибка 5. Нет public PoC = можно забыть
Нет. PoC — только один threat signal.
Ошибка 6. Patch deployed = ticket можно закрыть
Нет. Нужен verification: новая версия, rescan/retest, отсутствие vulnerable artifact/path.
Ошибка 7. Risk accepted = навсегда
Нет. Нужны owner, expiry и reopen trigger.
Ошибка 8. Security должен всегда требовать fix
Нет. Security должен обеспечить правильное решение по риску.
Небольшой practical model для команды
Если строишь процесс с нуля (from scratch), я бы начал не с сложного scoring engine, а с пяти обязательных полей:
1. Exposure
2. Reachability
3. Exploit status
4. Asset/business criticality
5. Verified controls
И добавил meta-field:
Assessment Confidence: Low / Medium / High
Почему confidence важен?
Потому что:
"Not reachable, confidence HIGH"
и
"Not reachable, because scanner didn't find anything, confidence LOW"
ТУТ, как видишь, совершенно разные решения.
Финальная модель
Я бы визуализировал современный vulnerability triage так:
+----------------------+
| Finding / CVE / CWE |
+----------+-----------+
|
v
+----------------------+
| Applicability |
| version/build/runtime|
+----------+-----------+
|
v
+----------------------+
| Exposure |
| Internet/Auth/Trust |
+----------+-----------+
|
v
+----------------------+
| Reachability |
| route/call/taint |
+----------+-----------+
|
v
+----------------------+
| Exploitability |
| CVSS/EPSS/KEV/PoC |
+----------+-----------+
|
v
+----------------------+
| Identity + Blast |
| Radius + Crown Jewels|
+----------+-----------+
|
v
+----------------------+
| Business Impact |
+----------+-----------+
|
v
+----------------------+
| Verified Controls |
+----------+-----------+
|
v
+----------------------+
| Risk / Priority |
| P0 / P1 / P2 / P3 |
+----------+-----------+
|
v
+----------------------+
| Treatment |
| Fix/Mitigate/Accept |
+----------+-----------+
|
v
+----------------------+
| Verify + Reassess |
+----------------------+
И здесь CVSS остаётся важным. Просто он больше не сидит на вершине трона. Он занимает своё правильное место: один из входных signals в инженерную систему принятия решений.
Главное
Когда я был инженером, моя задача не сводилась к тому, чтобы найти vulnerability и назвать её Critical.
Моя задача была сделать проблему понятной и помочь команде принять правильное решение.
Иногда правильное решение — emergency patch.
Иногда — выключить feature за 15 минут и patch сделать завтра.
Иногда — закрыть Internet route.
Иногда — урезать IAM и разорвать exploit chain.
Иногда — задокументировать, что vulnerable code path в нашем продукте реально недостижим, и спокойно исправить dependency в следующем release.
Но любое из этих решений должно быть основано на evidence, а не на ощущении.
Не спрашивай только: «Какой CVSS?»
Спрашивай: «Это применимо к нам? Может ли attacker добраться до vulnerable path? Насколько вероятна эксплуатация? Что он получит после первого шага? Какой blast radius? Что потеряет бизнес? И как быстрее всего разорвать attack path?»
Вот в этот момент vulnerability management перестаёт быть сортировкой красных строк в dashboard и становится настоящей Product Security engineering discipline.
Бесплатный toolbox: куда я захожу во время vulnerability triage
Ни один внешний портал не знает вашу architecture, identities, trust boundaries и business impact. Но несколько бесплатных источников могут очень быстро закрыть часть fact-finding.
| Resource | Для чего я бы использовал | Что помнить |
|---|---|---|
| FIRST EPSS | Probability + percentile, history, API и ежедневный CSV. Отличный enrichment для большого backlog. | Это forecast exploitation, а не ваш полный risk score. |
| CISA KEV | Быстро проверить, есть ли подтверждённая exploitation in the wild. | KEV — сильный threat signal, но всё равно нужно подтвердить applicability к вашему продукту. |
| Rapid7 Vulnerability & Exploit Database | Очень удобный визуальный CVE browser: CVSS v3/v4, EPSS, Exploited in the Wild, наличие Metasploit module и emergent-threat research. |
Хорош для быстрого analyst view; final verdict всё равно сверяйте с vendor advisory и вашим environment. |
| OSV.dev + OSV-Scanner | Open-source dependencies, lockfiles/SBOM/container images, fixed versions, HTML/JSON/SARIF; для поддерживаемых языков есть call analysis. |
called=false или отсутствие найденного path — evidence, а не абсолютное доказательство безопасности. Dynamic loading/reflection всё ещё важны. |
| ProjectDiscovery CVEMap | Быстрый CLI/enrichment: CVSS, EPSS, KEV, PoC, Nuclei coverage, age и фильтрация; удобно для shell/JSON automation. | Это агрегатор. Для critical decision проверяйте первоисточники и vendor advisory. |
И я всё равно держу рядом NVD как хороший baseline для CVE/CVSS/CWE/CPE и references. Сам NVD отдельно подчёркивает, что CVSS — это severity, а не risk.
Zero-budget triage в Excel / Google Sheets
Если ASPM/VM platform пока нет, можно собрать surprisingly useful workflow буквально из CSV и нескольких enrichment sources.
- Выгрузить findings из SCA/VM/scanner в CSV.
- Подтянуть EPSS probability + percentile из FIRST API/CSV.
- Добавить флаг KEV.
- Заполнить руками или из asset inventory локальный context.
- Фильтровать backlog уже не только по CVSS.
Я бы использовал такие колонки:
CVE / Finding ID
Asset / Service
Environment
Owner
CVSS + Vector
EPSS Probability
EPSS Percentile
EPSS Checked At
KEV Y/N
Public PoC / Exploit Y/N
Internet Exposure
Authentication Required
Reachability
Reachability Evidence
Runtime Identity / Privileges
Asset Criticality
Blast Radius
Business Impact
Compensating Controls
Assessment Confidence
Risk Priority
Remediation Effort
Change Risk
Treatment
SLA / Due Date
Exception Expiry
Reopen Triggers
FIRST публикует EPSS как API и daily CSV, поэтому его легко JOIN-нуть по CVE даже без коммерческого tooling. Главное — не пытаться превратить spreadsheet в магический formula engine: таблица должна сохранять evidence и помогать принять решение, а не скрывать reasoning за непрозрачным score.
References and further reading
- FIRST — CVSS v4.0 User Guide https://www.first.org/cvss/v4.0/user-guide
- FIRST — CVSS v4.0 Specification https://www.first.org/cvss/v4.0/specification-document
- FIRST — Exploit Prediction Scoring System (EPSS) https://www.first.org/epss/
- FIRST — EPSS FAQ https://www.first.org/epss/faq
- CISA — Known Exploited Vulnerabilities Catalog https://www.cisa.gov/known-exploited-vulnerabilities-catalog
- CISA — Stakeholder-Specific Vulnerability Categorization (SSVC) https://www.cisa.gov/stakeholder-specific-vulnerability-categorization-ssvc
- CISA — SBOM / VEX Resources Library https://www.cisa.gov/topics/cyber-threats-and-advisories/sbom/sbomresourceslibrary
- CycloneDX — Vulnerability Exploitability eXchange (VEX) https://cyclonedx.org/capabilities/vex/
- NIST SP 800-40 Rev. 4 — Guide to Enterprise Patch Management Planning https://csrc.nist.gov/pubs/sp/800/40/r4/final
- NIST IR 8179 — Criticality Analysis Process Model https://csrc.nist.gov/pubs/ir/8179/final
- NIST IR 8286B — Prioritizing Cybersecurity Risk for Enterprise Risk Management https://www.nist.gov/publications/prioritizing-cybersecurity-risk-enterprise-risk-management-0
- OWASP — Risk Rating Methodology https://owasp.org/www-community/OWASP_Risk_Rating_Methodology
- OWASP — Vulnerable Dependency Management Cheat Sheet https://cheatsheetseries.owasp.org/cheatsheets/Vulnerable_Dependency_Management_Cheat_Sheet.html
- Google — OSV-Scanner Call Analysis https://google.github.io/osv-scanner/output/
- OWASP dep-scan — Reachability-aware dependency analysis https://github.com/owasp-dep-scan/dep-scan
- JetBrains — CVE-2023-42793 TeamCity security issue https://blog.jetbrains.com/teamcity/2023/09/critical-security-issue-affecting-teamcity-on-premises-update-to-2023-05-4-now/
- JetBrains — CVE-2023-42793 exploitation update https://blog.jetbrains.com/teamcity/2023/10/cve-2023-42793-vulnerability-in-teamcity-october-18-2023-update/
- Jenkins — Security Advisory 2024-01-24 / CVE-2024-23897 https://www.jenkins.io/security/advisory/2024-01-24/
- Red Hat — CVE-2024-3094 / XZ Utils alert https://www.redhat.com/en/blog/urgent-security-alert-fedora-40-and-rawhide-users
- FIRST — EPSS Get the Data (API + daily CSV) https://www.first.org/epss/data
- Rapid7 — Vulnerability & Exploit Database https://www.rapid7.com/db/
- ProjectDiscovery — CVEMap https://github.com/projectdiscovery/cvemap
- NIST — National Vulnerability Database (NVD) https://nvd.nist.gov/
Originally published by Dev.to Security. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.





