@absolutejs/脆弱
用于绝对JS应用的可再利用的脆弱性管理原始. 软件包使扫描器输出正常化,并采用明确的严重程度阈值, 通过与部署兼容的目标收集Debian/Ubuntu主机库存,以及 (c) 制作适合于储存或遵守报告的证据物件.
版本 0.2.0 还定义了饲料适配器共享的犬科合同,
扫描仪适配器、持久性层、补救工人和主机应用。 资产,
部分、咨询意见、扫描仪、管理的调查结果、VEX决定、,
风险评估、补救计划和执行证据均载有
明确的合同版本.
它刻意保留发包版本和供应商安全
状态。 类似版本 1.24.0-2ubuntu7.5 绝不能降低到上游
1.24.0: Ubuntu 和其他分布式后端端口安全修正,不带
更改上游版本,丢弃 distro 修订版会产生虚假
阳性.
import {
assertVulnerabilityPolicy,
createVulnerabilityEvidence,
summarizeGrypeReport,
} from "@absolutejs/vulnerabilities";
const counts = summarizeGrypeReport(await Bun.file("grype.json").json());
assertVulnerabilityPolicy(counts, {
maximums: { critical: 0, high: 0 },
});
const evidence = createVulnerabilityEvidence({
asset: { id: imageDigest, kind: "container" },
scan: {
...counts,
databaseBuiltAt: grypeDatabaseBuiltAt,
scannedAt: new Date().toISOString(),
scanner: "grype",
},
});
主机收藏结构兼容 @absolutejs/deploy 目标 :
import { collectDebianHostInventory } from "@absolutejs/vulnerabilities/host";
const inventory = await collectDebianHostInventory(deployTarget);
扫描仪的执行、时间安排、持久性、补救批准和用户 界面仍然是应用程序关切。 这个包包拥有合同和 这些申请不应手卷.
补救生命周期使部署成功与安全分开
核查。 成功执行需要部署证据,并且
发现变成 fixed 只有在后来的一次清单观察证明是
缺席。 在等待核查时,对调查结果的补救仍然开放.
清单关联性具有生态系统意识,当版本时失效
方案无法比较. osv.ecosystem 保留供应商
释放上下文,例如 Ubuntu:24.04 组件 purl 仍为 a
标准 pkg:deb 标识符.
import { correlateVulnerabilityInventory } from "@absolutejs/vulnerabilities";
const result = correlateVulnerabilityInventory({
advisories,
asset,
components,
existingFindings,
observedAt: new Date().toISOString(),
});
await findingStore.saveMany(result.upserts);
管理下的查找身份是确定性的和扫描器独立的:
import { createStableFindingId } from "@absolutejs/vulnerabilities";
const findingId = createStableFindingId({
tenantId: "tenant-1",
assetId: "production-web-1",
componentIdentity: "pkg:deb/ubuntu/[email protected]",
vulnerabilityIds: ["CVE-2026-0001", "USN-9999-1"],
});
异名顺序,重复的别名,和标识大小写不会改变结果. 改变租户、资产、组成部分身份或脆弱性身份确实如此.
版本智能
版本比较具有生态系统意识和可解释性。 德比安/乌本图订正案, 时代和后港后缀被保留,而不是缩小为上游 各个版本。 SemVer, Go 模块, Python PEP 440, 和 Nuget 版本使用其本地版本 命令规则.
import {
comparePackageVersions,
evaluateVersionConstraints,
} from "@absolutejs/vulnerabilities";
comparePackageVersions({
ecosystem: "ubuntu",
left: "1.24.0-2ubuntu7.4",
right: "1.24.0-2ubuntu7.5",
});
evaluateVersionConstraints({
ecosystem: "ubuntu",
installedVersion: "1.24.0-2ubuntu7.4",
constraints: [
{ operator: "gte", version: "1.24.0" },
{ operator: "lt", version: "1.24.0-2ubuntu7.5" },
],
});
RPM,APK,和马文比较需要经过验证的适配器. 没有一个人
软件包返回 unknown;它从未取代词典学或通用SemVer
对于一个生态系统,它无法进行合理的比较.
咨询服务
Feed适配器共享光标,快照,缓存和故障隔离合同. 应用程序可以在自己的存储中坚持快照,同时保留提供者 获取与政策和补救逻辑分开.
警报操作可以使用 VulnerabilityAlertConfiguration 保持评价
苏丹解放军、针对严重程度的升级时间、开放/升级/解决
在一份经审定的合同中通知路线。 使用
validateVulnerabilityAlertConfiguration 在持久性边界和
resolveVulnerabilityAlertAudiences 当排队送货。 所有者路线跌倒
当警报没有自有资产时,返回管理员.
import { createMemoryFeedStore, syncFeed } from "@absolutejs/vulnerabilities";
const result = await syncFeed({
adapter,
maxStaleMs: 24 * 60 * 60 * 1_000,
store: createMemoryFeedStore(),
});
if (result.status === "stale") {
// Cached intelligence remains available, with the provider error attached.
}
适配器可以替换完整的提供者快照或递增合并
记录和删除. not_modified 答复需要现有缓存
快照, 提供者失败 永远不会抹去上次成功的快照 .
生产仓库仍可通过 FeedSnapshotStore, (中文(简体) ),
FeedSyncRunStore,以及 ManagedFindingStore 合同。 录音刷新
持续状态、错误、修订、时间戳和记录点数
连接给数据库驱动器的种子 .
部署许可可以保留一个签名的OSV和CISA KEV快照,而不是 在激活路径上呼叫上游提供者. 精确软件包/版本 覆盖是所签署有效载荷的一部分,包括未返回的查询 忠告,所以缺少的情报不能被解释为干净的结果.
import {
admissionIntelligenceCoverageKey,
signAdmissionIntelligenceSnapshot,
} from "@absolutejs/vulnerabilities/intelligence-snapshot";
const attestation = signAdmissionIntelligenceSnapshot({
coverage: components.map(({ identity }) =>
admissionIntelligenceCoverageKey(identity),
),
issuedAt: new Date().toISOString(),
kev: kevSnapshot,
keyId: "vulnerability-intelligence-v1",
maxAgeMs: 24 * 60 * 60 * 1_000,
osv: osvSnapshot,
secret: signingSecret,
});
客户端证据可以被装入捆绑运行时间的 Ed25519 捆绑 SBOM,签名 情报快照, 录取决定, 和准确的VEX 使用的例外。 核查只需要公用钥匙。 交叉签名的密钥 当操作员旋转签名身份时,过渡会维护信任.
import {
createEvidenceSigningIdentity,
evidenceVerificationKeyFrom,
signVulnerabilityEvidenceBundle,
verifyVulnerabilityEvidenceBundle,
} from "@absolutejs/vulnerabilities/evidence-bundle";
const identity = createEvidenceSigningIdentity();
const bundle = signVulnerabilityEvidenceBundle({ identity, payload });
const verification = verifyVulnerabilityEvidenceBundle({
bundle,
trustedKeys: [evidenceVerificationKeyFrom(identity)],
});
私人钥匙仍然是应用程序的秘密。 已发布的信任主锚包含 只有关键ID,指纹,创建时间,算法,和DER公钥.
密钥的创建、旋转和撤销也可记录在签名中, 散列透明日志。 一个客户端给起源钥匙指纹钉上针头 最新的日志头,或两者都通过一个可信任的频段外通道。 这个探测器 重写或切换历史并拒绝由被取消的密钥签名的捆绑 .
absolute-vulnerability-evidence verify \
--bundle vulnerability-evidence.json \
--registry vulnerability-evidence-registry.json \
--trusted-fingerprint <genesis-sha256-fingerprint> \
--trusted-head <sha256-log-head> \
--trusted-witness-fingerprint <witness-sha256-fingerprint>
命令输出 0 只为可靠证据, 1 用于加密
有效但不信任或被撤销的证据,以及 2 用于无效输入或使用.
如果登记处包括独立证人的收据,可选的
证人指纹要求收据符合准确的日志头和尺寸.
使用多个独立证人的应用程序
verifyEvidenceWitnessQuorum; 从一个身份复制的收据从不计数
不止一次达到法定法定人数.