triaging-security-findings

作者: bitwarden

当用户要求“对安全发现进行分类”、“修复 Checkmarx 发现”、“审查 SonarCloud 结果”、“驳回误报”等时,应使用此技能。

npx skills add https://github.com/bitwarden/ai-plugins --skill triaging-security-findings

Scanner Landscape

Bitwarden uses three scanners, all triggered by the scan.yml GitHub Actions workflow in each repository:

Checkmarx One — SAST (static analysis) and IaC (infrastructure as code) scanning. Dedicated cloud tenant named "bitwarden". Results upload to GitHub Advanced Security via SARIF format and post as PR annotations. Checkmarx understands branch differences, so PR results show only what changed. Access the Checkmarx webapp at the AST WebApp (tenant: "bitwarden") or via the Workspace Directory.

SonarCloud — Quality and security hotspot scanning. Free public cloud offering (not licensed for private repos). Uses quality profiles and gates for customized results. Posts PR annotations. Results also propagate to GitHub's security section. Configure via sonar-config input: default, dotnet, or maven.

Grype — Container image and filesystem vulnerability scanner. CVE-focused. Used for supply chain and dependency vulnerability detection.

GitHub Advanced Security API

Use these gh api commands to query and manage security findings:

Code Scanning Alerts (Checkmarx, SonarCloud)

# List all open code scanning alerts
gh api /repos/{owner}/{repo}/code-scanning/alerts --jq '.[] | {number, state, rule: .rule.id, severity: .rule.security_severity_level, path: .most_recent_instance.location.path}'

# Get details for a specific alert
gh api /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}

# Filter alerts by path (useful for file-specific triage)
gh api "/repos/{owner}/{repo}/code-scanning/alerts?ref={branch}&state=open" --jq '.[] | select(.most_recent_instance.location.path | startswith("src/Api"))'

# Filter by tool (separate Checkmarx from SonarCloud results)
gh api "/repos/{owner}/{repo}/code-scanning/alerts?tool_name=Checkmarx&state=open"
gh api "/repos/{owner}/{repo}/code-scanning/alerts?tool_name=SonarQube&state=open"

# Dismiss an alert as false positive
gh api -X PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number} \
  -f state=dismissed \
  -f dismissed_reason=false\ positive \
  -f dismissed_comment="Rationale for dismissal"

# Dismiss as won't fix
gh api -X PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number} \
  -f state=dismissed \
  -f dismissed_reason=won\'t\ fix \
  -f dismissed_comment="Rationale"

Dependabot Alerts

# List open Dependabot alerts
gh api /repos/{owner}/{repo}/dependabot/alerts --jq '.[] | {number, state, severity: .security_vulnerability.severity, package: .security_vulnerability.package.name, ecosystem: .security_vulnerability.package.ecosystem}'

# Get specific alert details
gh api /repos/{owner}/{repo}/dependabot/alerts/{alert_number}

Secret Scanning Alerts

# List secret scanning alerts
gh api /repos/{owner}/{repo}/secret-scanning/alerts --jq '.[] | {number, state, secret_type, created_at}'

Checkmarx Finding States

These are the states available in Checkmarx for managing findings. Getting the state right matters — it affects whether the finding reappears in future scans.

StateWhen to UseEffect
Not ExploitableCERTAIN there is no potential risk at ANY point in the product's lifecycleFinding stops appearing in subsequent scans
Proposed Not ExploitableSuspected false positive, needs team verificationFlags for review; requires manager approval for promotion
ConfirmedVulnerability poses a real risk to be addressed during developmentTracked as known issue
UrgentAcute risk requiring immediate attentionEscalated priority

Critical Rules for State Changes

  • Never mark as Not Exploitable just because the app isn't in production yet, or because it's currently on a local server. Consider the full product lifecycle — if deploying to cloud or going to production would make it exploitable, it IS exploitable.
  • Validation is not sufficient. Checkmarx does not consider adding validation steps as a foolproof solution because they leave threatening input values in place. Sanitizers (which replace threatening values) are preferred. Do not mark a finding as Not Exploitable solely on the basis of a validation step.
  • When uncertain, use Proposed Not Exploitable and discuss with the team or #team-eng-appsec.
  • Document the rationale — every state change should include a clear explanation of why.

SonarCloud Finding Management

SonarCloud categorizes findings as issues (code quality and bugs) and security hotspots (code that needs manual security review).

  • Issues have severity levels and can be resolved, confirmed, or marked as won't fix
  • Security hotspots require review to determine if they are actually vulnerable
  • Quality gates enforce thresholds — a failing quality gate blocks the PR
  • Results depend on the base branch quality; until initial triage is complete, PR results may be noisy

False Positive Protocol

Before dismissing any finding, follow this decision tree:

  1. Trace the data flow. Can untrusted input actually reach the flagged sink? Follow the data from entry point through all transformations to the flagged location.
  2. Check for existing sanitization. Is there encoding, escaping, or sanitization in the data path? Remember: validation alone is insufficient for Checkmarx findings.
  3. Consider the full lifecycle. Even if the code isn't deployed to a risky environment today, will it be? Private repos may go public. Local deployments may move to cloud.
  4. Document the rationale. Every dismissal must include a clear, reviewable explanation of why the finding is not exploitable.

If any step is uncertain, mark as Proposed Not Exploitable rather than Not Exploitable.

Fix Implementation Patterns

Common remediation patterns by vulnerability type:

VulnerabilityWrongRight
SQL InjectionString concatenation in queriesParameterized queries / stored procedures
XSSRaw interpolation in HTMLOutput encoding / framework auto-escaping
Path TraversalDirect use of user-supplied pathsCanonicalize + validate against allowed base path
SSRFDirect use of user-supplied URLsAllowlist of permitted hosts/schemes
Insecure DeserializationDeserializing untrusted input with type infoUse safe serializers, avoid TypeNameHandling.All
Hardcoded SecretsCredentials in source codeEnvironment variables / Azure Key Vault
XXEDefault XML parser settingsDisable DTD processing and external entities

Private Repository Notes

  • SARIF upload to GitHub Advanced Security will fail for private repos (GitHub billing limitation). Disable by passing upload-sarif: false to the Checkmarx reusable workflow.
  • SonarCloud is not licensed for private repos. Remove the quality job from scan.yml entirely for private repos.
  • When a private repo goes public, re-enable both.

来自 bitwarden 的更多技能

analyzing-git-sessions
bitwarden
分析指定时间范围或提交区间内的Git提交与变更,生成结构化摘要,用于代码审查、回顾、工作日志或会话记录等场景。
official
figma-to-angular
bitwarden
该技能将Figma设计规范转化为在Bitwarden Clients单体仓库中完全实现的Angular组件,并附带Storybook故事。输出结果应在视觉上与设计一致,同时遵循所有代码库约定。
official
agent-access
bitwarden
通过aac从用户的Bitwarden保管库中检索登录凭据、API密钥和机密(用户名、密码、TOTP)。当您需要凭据来登录…时使用。
official
action-audit
bitwarden
Audit GitHub Actions action usage across an org. Searches for a specific action (incident mode) or sweeps all workflow files for non-compliant action…
official
action-remediate
bitwarden
Remediate GitHub Actions action findings identified by the action-audit skill. Applies the appropriate fix per action type — `@main` ref for internal…
official
analyzing-code-security
bitwarden
此技能应在用户要求“分析代码中的安全问题”、“检查OWASP漏洞”、“对照CWE Top 25审查代码”、“查找…”时使用。
official
applying-bitwarden-branding
bitwarden
Apply Bitwarden brand standards — logo usage, color palette, typography, iconography, and capitalization rules — grounded in bitwarden.com/brand and the…
official
architecting-solutions
bitwarden
在团队层面进行解决方案架构设计,同时与Bitwarden的整体架构保持一致性。涵盖安全思维、架构判断力、……
official