@clear-capabilities/agentic-security-scanner 0.164.0 → 0.165.1
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 +14 -0
- package/dist/9560.index.js +5 -5
- package/dist/agentic-security.mjs +1 -1
- package/dist/agentic-security.mjs.sha256 +1 -1
- package/package.json +1 -1
- package/src/capabilities/CLAUDE.md +13 -10
- package/src/capabilities/attack-coverage.js +1 -1
- package/src/capabilities/manifest.js +2 -2
- package/src/capabilities/probes.js +3 -3
- package/src/capabilities/report.js +5 -4
- package/src/capabilities/runner.js +6 -1
- package/src/sandbox/CLAUDE.md +18 -7
- package/src/sandbox/backend-namespace.js +25 -10
- package/src/sandbox/capabilities.js +10 -0
- package/src/sandbox/control-probes.js +37 -3
- package/src/sandbox/limits.js +2 -0
- package/src/sandbox/linux-probes.js +2 -1
- package/src/sandbox/linux-rootfs.js +8 -1
- package/src/sandbox/supervise.js +8 -4
package/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,20 @@
|
|
|
9
9
|
> make the history less accurate, not more.
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
## 0.165.1 - documentation: the project guide no longer says the execution suites skip on hosted Linux
|
|
13
|
+
|
|
14
|
+
Documentation-only correction. The root `CLAUDE.md` still described Linux as `unverified` and said the execution suites skip on the hosted runner; since 0.165.0 they run in the `sandbox-linux` job (which fails on any skip) and Linux is recorded as `partially-verified`. The release leg itself still runs only the static closure, now stated with the real reason: the full closure has never been timed inside a hosted leg's budget. No code changed.
|
|
15
|
+
|
|
16
|
+
## 0.165.0 - Linux process-count cap proved on a hosted runner; the execution suites run on Linux
|
|
17
|
+
|
|
18
|
+
**The process-count cap works on Linux and is proved.** The cap was never applied before because the resource prelude ran under `dash`, which has no `ulimit -u`. The namespace backend now applies it with `prlimit --nproc` to the task's command only, after the confinement is built. On the hosted x86_64 `sandbox-linux` job, six concurrent children all start under a cap of 512 and only one starts under a cap of 3, in default mode and in capability mode. The probe is paired with fault injection: it fails against a runner that drops the cap and against one that caps everything. A requested cap is never silently dropped; a host without `prlimit` reports it unsupported. `process-cap` is verified for Linux only after that hosted result, and stays unverified on macOS.
|
|
19
|
+
|
|
20
|
+
**The execution suites now run on Linux with Linux semantics, with no skips.** The capabilities, trust-boundary and attack-corpus suites assert ENOENT or EROFS evidence for out-of-root access instead of macOS-style denial, use heartbeats instead of host pids for liveness, and expect a declared network destination to block the task. No assertion was weakened. A skip in the trust-boundary suite is gone. The hosted `sandbox-linux` job now also runs the capabilities, verification, invariants, documentation, trust-boundary and evidence-issuer suites and fails on any skip: 737 tests ran and passed, 0 skipped, 0 failed.
|
|
21
|
+
|
|
22
|
+
**A responsiveness defect found by the hosted run.** The supervisor's periodic synchronous `ps` sweep kept the controller's event loop 58 to 62 percent busy on Linux. It is off for the namespace backend, where the kernel already kills the namespace with its supervisor.
|
|
23
|
+
|
|
24
|
+
**Still open.** The hosted release leg still runs only the static closure: running the full closure there has never been timed on a hosted runner and would duplicate the test shards. Mediated network remains unsupported on Linux. The process-count behaviour was checked on kernel 6.8 only; older kernels count the limit per real uid system-wide, so a small cap could behave differently. The real-code accuracy gates and the routing promotion gate still need independently adjudicated data that code cannot produce, so the PRD closure verification still reports not complete.
|
|
25
|
+
|
|
12
26
|
## 0.164.0 - Linux isolation proved on a hosted runner, six controller limits enforced, closure evidence from CI
|
|
13
27
|
|
|
14
28
|
Closing gaps from the Differentiation PRD that software can close. The gaps that remain are named at the end; none of them is hidden by this release.
|
package/dist/9560.index.js
CHANGED
|
@@ -373,8 +373,8 @@ const MANIFEST_REQUIRED = ['schema', 'schemaVersion', 'taskId', 'repository', 'p
|
|
|
373
373
|
|
|
374
374
|
// Resource limits a manifest can carry. The first three come straight from the
|
|
375
375
|
// assurance config (same ranges), the file-size cap is enforced by the sandbox
|
|
376
|
-
// prelude,
|
|
377
|
-
//
|
|
376
|
+
// prelude, the process-count cap is enforced on the Linux namespace backend only (prlimit, proved by an
|
|
377
|
+
// active probe), and the memory cap is CARRIED but never claimed enforced.
|
|
378
378
|
const RESOURCE_RANGES = Object.freeze({
|
|
379
379
|
timeoutMs: { min: config/* LIMITS */.b1.timeoutMs.min, max: config/* LIMITS */.b1.timeoutMs.max },
|
|
380
380
|
maxOutputBytes: { min: config/* LIMITS */.b1.maxOutputBytes.min, max: config/* LIMITS */.b1.maxOutputBytes.max },
|
|
@@ -1532,11 +1532,11 @@ function platformStatements() {
|
|
|
1532
1532
|
evidence: 'sandbox-linux CI job (hosted ubuntu-latest, x86_64); scripts/sandbox-linux-verify.mjs',
|
|
1533
1533
|
verifiedControls: Object.freeze([
|
|
1534
1534
|
'write-confinement', 'read-denial', 'env-scrub', 'network', 'tree-termination', 'file-size-limit',
|
|
1535
|
-
'fs-read-confinement', 'fs-multi-root-write',
|
|
1535
|
+
'fs-read-confinement', 'fs-multi-root-write', 'process-cap',
|
|
1536
1536
|
]),
|
|
1537
1537
|
unsupportedControls: Object.freeze(['network-mediation']),
|
|
1538
|
-
unassertedControls: Object.freeze([
|
|
1539
|
-
note: 'advertised for enforced mode. Proved by active probes on the hosted Linux runner (not on every Linux host): write-confinement, read-denial, env-scrub, network, tree-termination, file-size-limit, fs-read-confinement, fs-multi-root-write. Mediated network is NOT implemented on the namespace backend (an empty network namespace has no path to a proxy), so a task that declares a network destination is blocked on Linux, never allowed. Process-count caps are
|
|
1538
|
+
unassertedControls: Object.freeze([]),
|
|
1539
|
+
note: 'advertised for enforced mode. Proved by active probes on the hosted Linux runner (not on every Linux host): write-confinement, read-denial, env-scrub, network, tree-termination, file-size-limit, fs-read-confinement, fs-multi-root-write, process-cap (a per-user-namespace process-count cap applied with prlimit after the confinement is built; the shell ulimit it replaces does not exist in dash). Mediated network is NOT implemented on the namespace backend (an empty network namespace has no path to a proxy), so a task that declares a network destination is blocked on Linux, never allowed. Process-count caps are claimed on Linux only, and only as that probe shows them; memory caps are not enforced. The attack corpus is not run in the sandbox-linux job, so corpus coverage stays unverified on Linux.',
|
|
1540
1540
|
},
|
|
1541
1541
|
darwin: {
|
|
1542
1542
|
backend: 'userspace', status: 'host-proved-not-advertised',
|