@clear-capabilities/agentic-security-scanner 0.167.0 → 0.168.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -0
- package/bin/agentic-security.js +1 -0
- package/dist/3736.index.js +2 -1
- package/dist/6932.index.js +1190 -0
- package/dist/agentic-security.mjs +2 -2
- package/dist/agentic-security.mjs.sha256 +1 -1
- package/package.json +2 -2
- package/src/posture/artifact-registry.js +3 -0
- package/src/posture/fleet/cli.js +103 -0
- package/src/posture/fleet/fleet-graph.js +142 -0
- package/src/posture/fleet/fleet-manifest.js +77 -0
package/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,48 @@
|
|
|
9
9
|
> make the history less accurate, not more.
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
## 0.168.0 - fleet: multi-repository scan orchestration and cross-repository dependency blast radius
|
|
13
|
+
|
|
14
|
+
A real, honestly-scoped slice of the organization-wide security graph recommendation: a new CLI command group,
|
|
15
|
+
`fleet init|scan|status|resume|query`, built almost entirely on existing machinery rather than a new engine.
|
|
16
|
+
|
|
17
|
+
**The manifest and the scan.** `fleet.yaml` declares an organization and a list of `{id, path}` repositories
|
|
18
|
+
(plus `workers` and `perRepoTimeout`), validated closed-world — an unknown key, a duplicate id, a non-kebab id or
|
|
19
|
+
an unresolvable path refuses the whole manifest. `fleet scan fleet.yaml` drives the EXISTING `posture/fleet.js`
|
|
20
|
+
(`runFleet`) over that list: bounded concurrency, a resumable on-disk checkpoint, per-repository isolation (one
|
|
21
|
+
repo exploding never takes the run down), and an honest rollup (a failed repo is reported failed, never folded
|
|
22
|
+
into "0 findings"). No new scanning engine was written for this.
|
|
23
|
+
|
|
24
|
+
**The new part: a cross-repository dependency graph.** Built purely from each repository's own package manifest
|
|
25
|
+
(`package.json`/`go.mod`/`Cargo.toml`/`requirements.txt`/`pyproject.toml` — name plus dependencies), with no
|
|
26
|
+
deployment configuration required, so a fleet of plain application repositories works immediately. `fleet query
|
|
27
|
+
--depends-on <repo-id>` answers "which repositories depend on this one, directly or transitively, and through
|
|
28
|
+
what path" — a real question about organization-wide blast radius, not a guess.
|
|
29
|
+
|
|
30
|
+
**A real, grounded demonstration, not an asserted-away fixture.** A four-repository synthetic organization
|
|
31
|
+
(frontend, payments-api, shared-auth-lib, payments-worker) where only `shared-auth-lib` carries an actual
|
|
32
|
+
command-injection vulnerability the deterministic engine genuinely finds (the same confirmed-detected shape —
|
|
33
|
+
`req.body.host` into `child_process.exec` — already used in this repository's own fixtures). The blast-radius
|
|
34
|
+
query correctly reports `frontend` and `payments-api` as direct dependents and `payments-worker` as a transitive
|
|
35
|
+
one, through `payments-api`, at the right depth, with the right path.
|
|
36
|
+
|
|
37
|
+
**A bug this process itself caught, twice.** A first draft of the fleet CLI wrapped `runScan()`'s own
|
|
38
|
+
`{ scan, meta }` return value in a SECOND `{ scan }` object; `runFleet`'s internal summarizer reads fields
|
|
39
|
+
defensively rather than throwing on the wrong shape, so every repository silently reported zero findings with no
|
|
40
|
+
error of any kind. Found by running the CLI against the fixture and noticing the finding count was wrong, not by
|
|
41
|
+
the automated test — whose own fixture at the time also happened to use a vulnerability shape the deterministic
|
|
42
|
+
engine does not actually flag (an unlabeled function parameter reaching `exec`, no recognized untrusted source).
|
|
43
|
+
Both are fixed, and the fixture now uses the same confirmed-detected shape the test asserts against.
|
|
44
|
+
|
|
45
|
+
**Still open, and disclosed as such** (`docs/implementation-status/fleet.md`): no Internet-facing/regulated-data
|
|
46
|
+
overlay — the fuller "which Internet-facing app can reach PCI data through this component" question needs the
|
|
47
|
+
existing deployment-boundary graph's trust-zone model layered on top of this dependency graph, not attempted
|
|
48
|
+
here; no natural-language query parser (`--depends-on <repo-id>` is the one supported shape); no SQLite-backed
|
|
49
|
+
storage (reuses the existing flat-JSON fleet checkpoint; `posture/portfolio/backend.js`'s existing storage
|
|
50
|
+
abstraction is the natural place for a SQLite implementation later); no persisted job queue with lease/retry
|
|
51
|
+
(reuses in-process `runFleet` rather than the heavier, operator-only `portfolio/work-units.js` scheduler); matching
|
|
52
|
+
across repositories is by declared package name only, with no ecosystem disambiguation.
|
|
53
|
+
|
|
12
54
|
## 0.167.0 - execution-backed exploit proof, and a self-learning rule compiler that turns one confirmed finding into a deterministic detection rule
|
|
13
55
|
|
|
14
56
|
Two new, independently opt-in capabilities, each off by default until explicitly invoked.
|
package/bin/agentic-security.js
CHANGED
|
@@ -7115,6 +7115,7 @@ async function main() {
|
|
|
7115
7115
|
case 'triage': process.exit(await cmdTriage(args));
|
|
7116
7116
|
case 'org-scan': process.exit(await cmdOrgScan(args));
|
|
7117
7117
|
case 'rules': process.exit(await cmdRules(args));
|
|
7118
|
+
case 'fleet': process.exit(await (await import('../src/posture/fleet/cli.js')).cmdFleet(args, path.resolve(args.flags.root || '.')));
|
|
7118
7119
|
case 'rule': process.exit(await cmdRule(args));
|
|
7119
7120
|
case 'tickets': process.exit(await cmdTickets(args));
|
|
7120
7121
|
case 'secure': process.exit(await cmdSecure(args));
|
package/dist/3736.index.js
CHANGED
|
@@ -10,10 +10,11 @@ export const modules = {
|
|
|
10
10
|
/* harmony export */ ensurePolicyKeyPair: () => (/* binding */ ensurePolicyKeyPair),
|
|
11
11
|
/* harmony export */ loadPolicyBundles: () => (/* binding */ loadPolicyBundles),
|
|
12
12
|
/* harmony export */ loadPolicyPublicKey: () => (/* binding */ loadPolicyPublicKey),
|
|
13
|
+
/* harmony export */ rE: () => (/* binding */ computePolicyDrift),
|
|
13
14
|
/* harmony export */ resolveEffectivePolicy: () => (/* binding */ resolveEffectivePolicy),
|
|
14
15
|
/* harmony export */ signPolicyBundle: () => (/* binding */ signPolicyBundle)
|
|
15
16
|
/* harmony export */ });
|
|
16
|
-
/* unused harmony exports POLICY_BUNDLE_SCHEMA, SCOPES, canonicalPolicyBytes, verifyPolicyBundle
|
|
17
|
+
/* unused harmony exports POLICY_BUNDLE_SCHEMA, SCOPES, canonicalPolicyBytes, verifyPolicyBundle */
|
|
17
18
|
/* harmony import */ var node_fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(73024);
|
|
18
19
|
/* harmony import */ var node_os__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(48161);
|
|
19
20
|
/* harmony import */ var node_path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(76760);
|