@node9/proxy 2.48.2 → 2.50.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/dist/cli-main.js +5480 -4202
- package/dist/dashboard.mjs +2452 -519
- package/dist/hook.js +530 -384
- package/dist/index.js +258 -113
- package/dist/index.mjs +258 -113
- package/dist/scan-ink.mjs +100 -0
- package/package.json +2 -2
package/dist/scan-ink.mjs
CHANGED
|
@@ -2378,6 +2378,47 @@ var BLOCK_ALL = {
|
|
|
2378
2378
|
"commands.unknown": "review",
|
|
2379
2379
|
"commands.temp-binary": "block"
|
|
2380
2380
|
};
|
|
2381
|
+
var ASI = {
|
|
2382
|
+
ASI01: "Agent Goal Hijack",
|
|
2383
|
+
ASI02: "Tool Misuse and Exploitation",
|
|
2384
|
+
ASI03: "Identity and Privilege Abuse",
|
|
2385
|
+
ASI04: "Agentic Supply Chain Vulnerabilities",
|
|
2386
|
+
ASI05: "Unexpected Code Execution",
|
|
2387
|
+
ASI06: "Memory and Context Poisoning",
|
|
2388
|
+
ASI07: "Insecure Inter-Agent Communication",
|
|
2389
|
+
ASI08: "Cascading Failures",
|
|
2390
|
+
ASI09: "Human-Agent Trust Exploitation",
|
|
2391
|
+
ASI10: "Rogue Agents"
|
|
2392
|
+
};
|
|
2393
|
+
var ASI_IDS = Object.keys(ASI);
|
|
2394
|
+
var PACK_SHIELD_OWASP = {
|
|
2395
|
+
aws: "ASI02",
|
|
2396
|
+
"bash-safe": "ASI02",
|
|
2397
|
+
docker: "ASI02",
|
|
2398
|
+
filesystem: "ASI02",
|
|
2399
|
+
github: "ASI02",
|
|
2400
|
+
k8s: "ASI02",
|
|
2401
|
+
mongodb: "ASI02",
|
|
2402
|
+
postgres: "ASI02",
|
|
2403
|
+
redis: "ASI02",
|
|
2404
|
+
stripe: "ASI09",
|
|
2405
|
+
paypal: "ASI09",
|
|
2406
|
+
square: "ASI09",
|
|
2407
|
+
plaid: "ASI09",
|
|
2408
|
+
okta: "ASI09",
|
|
2409
|
+
auth0: "ASI09"
|
|
2410
|
+
};
|
|
2411
|
+
var PACK_RULE_OWASP = {
|
|
2412
|
+
"packs.bash-safe.pipe-to-shell": "ASI05",
|
|
2413
|
+
"packs.bash-safe.obfuscated-exec": "ASI05",
|
|
2414
|
+
"packs.bash-safe.eval-remote": "ASI05",
|
|
2415
|
+
"packs.bash-safe.eval-dynamic": "ASI05",
|
|
2416
|
+
"packs.aws.iam-changes": "ASI03",
|
|
2417
|
+
"packs.postgres.grant-revoke": "ASI03"
|
|
2418
|
+
};
|
|
2419
|
+
function packRowOwasp(id, shield) {
|
|
2420
|
+
return PACK_RULE_OWASP[id] ?? PACK_SHIELD_OWASP[shield];
|
|
2421
|
+
}
|
|
2381
2422
|
var VERDICTS = ["off", "log", "review", "block"];
|
|
2382
2423
|
var ALL = VERDICTS;
|
|
2383
2424
|
var BUILTIN_DANGEROUS_WORDS = ["mkfs", "shred"];
|
|
@@ -2385,6 +2426,7 @@ var PRODUCT_CHECKS = [
|
|
|
2385
2426
|
{
|
|
2386
2427
|
id: "files.shell-startup",
|
|
2387
2428
|
group: "files",
|
|
2429
|
+
owasp: "ASI02",
|
|
2388
2430
|
title: "Shell startup files",
|
|
2389
2431
|
catches: "Writes, replacements and removals of personal shell startup files",
|
|
2390
2432
|
values: ALL,
|
|
@@ -2394,6 +2436,7 @@ var PRODUCT_CHECKS = [
|
|
|
2394
2436
|
{
|
|
2395
2437
|
id: "files.system-auth",
|
|
2396
2438
|
group: "files",
|
|
2439
|
+
owasp: "ASI03",
|
|
2397
2440
|
title: "System authentication files",
|
|
2398
2441
|
catches: "Changes to system authentication files and PAM configuration",
|
|
2399
2442
|
values: ["block"],
|
|
@@ -2404,6 +2447,7 @@ var PRODUCT_CHECKS = [
|
|
|
2404
2447
|
{
|
|
2405
2448
|
id: "files.password-hashes",
|
|
2406
2449
|
group: "files",
|
|
2450
|
+
owasp: "ASI03",
|
|
2407
2451
|
title: "System password hashes",
|
|
2408
2452
|
catches: "Reads and copies of /etc/shadow and /etc/gshadow",
|
|
2409
2453
|
values: ALL,
|
|
@@ -2413,6 +2457,7 @@ var PRODUCT_CHECKS = [
|
|
|
2413
2457
|
{
|
|
2414
2458
|
id: "files.system-dirs",
|
|
2415
2459
|
group: "files",
|
|
2460
|
+
owasp: "ASI02",
|
|
2416
2461
|
title: "System directories",
|
|
2417
2462
|
catches: "Writes, new files and removals under /usr, /etc, /boot, /bin, /sbin, /lib and /var/log, and uploads of system files",
|
|
2418
2463
|
values: ALL,
|
|
@@ -2422,6 +2467,7 @@ var PRODUCT_CHECKS = [
|
|
|
2422
2467
|
{
|
|
2423
2468
|
id: "files.agent-instructions",
|
|
2424
2469
|
group: "files",
|
|
2470
|
+
owasp: "ASI06",
|
|
2425
2471
|
title: "Agent instruction and memory files",
|
|
2426
2472
|
catches: "writes to the files every later agent session loads as instructions (CLAUDE.md, AGENTS.md, memory, agents, commands) and changes to the agent's hooks; Standard asks only when the text carries an instruction to hide, skip approvals or touch secrets",
|
|
2427
2473
|
values: ALL,
|
|
@@ -2432,6 +2478,7 @@ var PRODUCT_CHECKS = [
|
|
|
2432
2478
|
{
|
|
2433
2479
|
id: "commands.inline-exec",
|
|
2434
2480
|
group: "commands",
|
|
2481
|
+
owasp: "ASI05",
|
|
2435
2482
|
title: "Inline code execution",
|
|
2436
2483
|
catches: "inline code (python -c, node -e, a heredoc into an interpreter) that deletes, sends, opens a socket, runs commands, reads protected files or decodes and runs; unreadable inline code",
|
|
2437
2484
|
values: ALL,
|
|
@@ -2441,6 +2488,7 @@ var PRODUCT_CHECKS = [
|
|
|
2441
2488
|
{
|
|
2442
2489
|
id: "commands.eval-dynamic",
|
|
2443
2490
|
group: "commands",
|
|
2491
|
+
owasp: "ASI05",
|
|
2444
2492
|
title: "Eval of dynamic content",
|
|
2445
2493
|
catches: "generated executable names, shell code from stdin, or dynamic eval/-c payloads",
|
|
2446
2494
|
values: ALL,
|
|
@@ -2450,6 +2498,7 @@ var PRODUCT_CHECKS = [
|
|
|
2450
2498
|
{
|
|
2451
2499
|
id: "commands.eval-remote",
|
|
2452
2500
|
group: "commands",
|
|
2501
|
+
owasp: "ASI05",
|
|
2453
2502
|
title: "Eval of a remote download",
|
|
2454
2503
|
catches: "eval or sh over the output of curl or wget",
|
|
2455
2504
|
values: ["block"],
|
|
@@ -2460,6 +2509,7 @@ var PRODUCT_CHECKS = [
|
|
|
2460
2509
|
{
|
|
2461
2510
|
id: "commands.curl-pipe-shell",
|
|
2462
2511
|
group: "commands",
|
|
2512
|
+
owasp: "ASI05",
|
|
2463
2513
|
title: "Remote script piped into a shell",
|
|
2464
2514
|
catches: "curl or wget piped into sh, bash, zsh or PowerShell",
|
|
2465
2515
|
values: ALL,
|
|
@@ -2469,6 +2519,7 @@ var PRODUCT_CHECKS = [
|
|
|
2469
2519
|
{
|
|
2470
2520
|
id: "commands.rm",
|
|
2471
2521
|
group: "commands",
|
|
2522
|
+
owasp: "ASI02",
|
|
2472
2523
|
title: "Delete files",
|
|
2473
2524
|
catches: "rm outside the known build-artifact paths",
|
|
2474
2525
|
values: ALL,
|
|
@@ -2478,6 +2529,7 @@ var PRODUCT_CHECKS = [
|
|
|
2478
2529
|
{
|
|
2479
2530
|
id: "commands.rm-home",
|
|
2480
2531
|
group: "commands",
|
|
2532
|
+
owasp: "ASI02",
|
|
2481
2533
|
title: "Recursive delete of the home directory",
|
|
2482
2534
|
catches: "rm -rf on ~, $HOME, /home or /",
|
|
2483
2535
|
values: ["block"],
|
|
@@ -2488,6 +2540,7 @@ var PRODUCT_CHECKS = [
|
|
|
2488
2540
|
{
|
|
2489
2541
|
id: "commands.chmod",
|
|
2490
2542
|
group: "commands",
|
|
2543
|
+
owasp: "ASI02",
|
|
2491
2544
|
title: "World-writable permissions",
|
|
2492
2545
|
catches: "chmod 777, 0777 or a+rwx",
|
|
2493
2546
|
values: ALL,
|
|
@@ -2497,6 +2550,7 @@ var PRODUCT_CHECKS = [
|
|
|
2497
2550
|
{
|
|
2498
2551
|
id: "commands.sudo",
|
|
2499
2552
|
group: "commands",
|
|
2553
|
+
owasp: "ASI03",
|
|
2500
2554
|
title: "Elevated privileges",
|
|
2501
2555
|
catches: "a command run through sudo",
|
|
2502
2556
|
values: ALL,
|
|
@@ -2506,6 +2560,7 @@ var PRODUCT_CHECKS = [
|
|
|
2506
2560
|
{
|
|
2507
2561
|
id: "commands.git-destructive",
|
|
2508
2562
|
group: "commands",
|
|
2563
|
+
owasp: "ASI02",
|
|
2509
2564
|
title: "Destructive git operation",
|
|
2510
2565
|
catches: "force push, reset --hard, clean -f, branch -D or tag delete, also through -C, env, wrappers, variables and aliases",
|
|
2511
2566
|
values: ALL,
|
|
@@ -2515,6 +2570,7 @@ var PRODUCT_CHECKS = [
|
|
|
2515
2570
|
{
|
|
2516
2571
|
id: "commands.git-hooks-bypass",
|
|
2517
2572
|
group: "commands",
|
|
2573
|
+
owasp: "ASI10",
|
|
2518
2574
|
title: "Git hooks bypassed",
|
|
2519
2575
|
catches: "the agent switches off the git hooks that check its own work: --no-verify, core.hooksPath, HUSKY=0 and its peers, or a hook file removed, emptied or made non-executable",
|
|
2520
2576
|
values: ALL,
|
|
@@ -2524,6 +2580,7 @@ var PRODUCT_CHECKS = [
|
|
|
2524
2580
|
{
|
|
2525
2581
|
id: "commands.git-stage-all",
|
|
2526
2582
|
group: "commands",
|
|
2583
|
+
owasp: "ASI02",
|
|
2527
2584
|
title: "Stage everything at once",
|
|
2528
2585
|
catches: "git add -A, git add ., git commit -a and other ways to stage every change instead of naming the files; off unless you switch it on",
|
|
2529
2586
|
values: ALL,
|
|
@@ -2533,6 +2590,7 @@ var PRODUCT_CHECKS = [
|
|
|
2533
2590
|
{
|
|
2534
2591
|
id: "commands.reverse-shell",
|
|
2535
2592
|
group: "commands",
|
|
2593
|
+
owasp: "ASI05",
|
|
2536
2594
|
title: "Reverse shell",
|
|
2537
2595
|
catches: "a shell wired to a network socket: bash -i >& /dev/tcp/\u2026, nc -e, socat exec:, a socket fd read by a shell, a shell piped to and from nc or telnet",
|
|
2538
2596
|
values: ALL,
|
|
@@ -2542,6 +2600,7 @@ var PRODUCT_CHECKS = [
|
|
|
2542
2600
|
{
|
|
2543
2601
|
id: "commands.node9-disarm",
|
|
2544
2602
|
group: "commands",
|
|
2603
|
+
owasp: "ASI10",
|
|
2545
2604
|
title: "node9 disarmed from the shell",
|
|
2546
2605
|
catches: "a node9 command that clears a session flag, trusts a destination, pauses the gate or weakens a shield, run by the agent",
|
|
2547
2606
|
values: ALL,
|
|
@@ -2551,6 +2610,7 @@ var PRODUCT_CHECKS = [
|
|
|
2551
2610
|
{
|
|
2552
2611
|
id: "commands.sql-ddl",
|
|
2553
2612
|
group: "commands",
|
|
2613
|
+
owasp: "ASI02",
|
|
2554
2614
|
title: "Drop or truncate",
|
|
2555
2615
|
catches: "DROP or TRUNCATE through a database CLI or a database tool",
|
|
2556
2616
|
values: ALL,
|
|
@@ -2565,6 +2625,7 @@ var PRODUCT_CHECKS = [
|
|
|
2565
2625
|
{
|
|
2566
2626
|
id: "commands.sql-no-where",
|
|
2567
2627
|
group: "commands",
|
|
2628
|
+
owasp: "ASI02",
|
|
2568
2629
|
title: "Unscoped SQL mutation",
|
|
2569
2630
|
catches: "DELETE or UPDATE without a WHERE clause",
|
|
2570
2631
|
values: ALL,
|
|
@@ -2574,6 +2635,7 @@ var PRODUCT_CHECKS = [
|
|
|
2574
2635
|
{
|
|
2575
2636
|
id: "commands.temp-binary",
|
|
2576
2637
|
group: "commands",
|
|
2638
|
+
owasp: "ASI05",
|
|
2577
2639
|
title: "Binary from a temp directory",
|
|
2578
2640
|
catches: "an absolute path under /tmp, /var/tmp, /dev/shm or a world-writable file",
|
|
2579
2641
|
values: ALL,
|
|
@@ -2583,6 +2645,7 @@ var PRODUCT_CHECKS = [
|
|
|
2583
2645
|
{
|
|
2584
2646
|
id: "commands.disk-destroy",
|
|
2585
2647
|
group: "commands",
|
|
2648
|
+
owasp: "ASI02",
|
|
2586
2649
|
title: "Disk or filesystem destruction",
|
|
2587
2650
|
catches: "mkfs, shred, dd and the manual-terminal disaster list",
|
|
2588
2651
|
values: ALL,
|
|
@@ -2592,6 +2655,7 @@ var PRODUCT_CHECKS = [
|
|
|
2592
2655
|
{
|
|
2593
2656
|
id: "commands.dangerous-word",
|
|
2594
2657
|
group: "commands",
|
|
2658
|
+
owasp: "ASI02",
|
|
2595
2659
|
title: "Dangerous word",
|
|
2596
2660
|
catches: "a word from a pack or from the config dangerousWords list",
|
|
2597
2661
|
values: ALL,
|
|
@@ -2600,6 +2664,7 @@ var PRODUCT_CHECKS = [
|
|
|
2600
2664
|
{
|
|
2601
2665
|
id: "commands.unanalysable",
|
|
2602
2666
|
group: "commands",
|
|
2667
|
+
owasp: "ASI02",
|
|
2603
2668
|
title: "Command too nested to analyse",
|
|
2604
2669
|
catches: "wrappers nested past the depth the shell parser follows",
|
|
2605
2670
|
values: ALL,
|
|
@@ -2609,6 +2674,7 @@ var PRODUCT_CHECKS = [
|
|
|
2609
2674
|
{
|
|
2610
2675
|
id: "commands.unknown",
|
|
2611
2676
|
group: "commands",
|
|
2677
|
+
owasp: "ASI02",
|
|
2612
2678
|
title: "Any command no check recognised",
|
|
2613
2679
|
catches: "the strict-mode catch-all",
|
|
2614
2680
|
values: ["off", "review"],
|
|
@@ -2619,6 +2685,7 @@ var PRODUCT_CHECKS = [
|
|
|
2619
2685
|
{
|
|
2620
2686
|
id: "data.secrets",
|
|
2621
2687
|
group: "data",
|
|
2688
|
+
owasp: "ASI03",
|
|
2622
2689
|
title: "Secret in arguments",
|
|
2623
2690
|
catches: "an API key, token or private key matching one of the DLP patterns",
|
|
2624
2691
|
values: ALL,
|
|
@@ -2628,6 +2695,7 @@ var PRODUCT_CHECKS = [
|
|
|
2628
2695
|
{
|
|
2629
2696
|
id: "data.secrets-weak",
|
|
2630
2697
|
group: "data",
|
|
2698
|
+
owasp: "ASI03",
|
|
2631
2699
|
title: "Weak credential in arguments",
|
|
2632
2700
|
catches: "a JWT or a bearer token",
|
|
2633
2701
|
values: ALL,
|
|
@@ -2637,6 +2705,7 @@ var PRODUCT_CHECKS = [
|
|
|
2637
2705
|
{
|
|
2638
2706
|
id: "data.pii",
|
|
2639
2707
|
group: "data",
|
|
2708
|
+
owasp: "ASI02",
|
|
2640
2709
|
title: "Personal data in arguments",
|
|
2641
2710
|
catches: "a social security number or a credit card number",
|
|
2642
2711
|
values: ALL,
|
|
@@ -2646,6 +2715,7 @@ var PRODUCT_CHECKS = [
|
|
|
2646
2715
|
{
|
|
2647
2716
|
id: "data.credential-files",
|
|
2648
2717
|
group: "data",
|
|
2718
|
+
owasp: "ASI03",
|
|
2649
2719
|
title: "Credential file read",
|
|
2650
2720
|
catches: "~/.ssh, ~/.aws and .env files, through any reader or any file tool",
|
|
2651
2721
|
values: ALL,
|
|
@@ -2654,6 +2724,7 @@ var PRODUCT_CHECKS = [
|
|
|
2654
2724
|
{
|
|
2655
2725
|
id: "data.credential-files-other",
|
|
2656
2726
|
group: "data",
|
|
2727
|
+
owasp: "ASI03",
|
|
2657
2728
|
title: "Other credential file",
|
|
2658
2729
|
catches: ".netrc, .npmrc, kube and docker config, and a copy of any credential file",
|
|
2659
2730
|
values: ALL,
|
|
@@ -2662,6 +2733,7 @@ var PRODUCT_CHECKS = [
|
|
|
2662
2733
|
{
|
|
2663
2734
|
id: "data.credential-files-unknown",
|
|
2664
2735
|
group: "data",
|
|
2736
|
+
owasp: "ASI03",
|
|
2665
2737
|
title: "Files read by names known only at run time",
|
|
2666
2738
|
catches: "a reader fed names from a listing that can include credential files (find . | xargs cat)",
|
|
2667
2739
|
values: ALL,
|
|
@@ -2670,6 +2742,7 @@ var PRODUCT_CHECKS = [
|
|
|
2670
2742
|
{
|
|
2671
2743
|
id: "data.pipe-chain",
|
|
2672
2744
|
group: "data",
|
|
2745
|
+
owasp: "ASI03",
|
|
2673
2746
|
title: "Sensitive file piped to the network",
|
|
2674
2747
|
catches: "a credential file read and piped into curl, nc or ssh",
|
|
2675
2748
|
values: ALL,
|
|
@@ -2679,6 +2752,7 @@ var PRODUCT_CHECKS = [
|
|
|
2679
2752
|
{
|
|
2680
2753
|
id: "data.pipe-chain-obfuscated",
|
|
2681
2754
|
group: "data",
|
|
2755
|
+
owasp: "ASI03",
|
|
2682
2756
|
title: "Obfuscated exfiltration",
|
|
2683
2757
|
catches: "a sensitive file encoded or compressed on its way to the network",
|
|
2684
2758
|
values: ALL,
|
|
@@ -2691,6 +2765,7 @@ var PRODUCT_CHECKS = [
|
|
|
2691
2765
|
{
|
|
2692
2766
|
id: "data.env-exfil",
|
|
2693
2767
|
group: "data",
|
|
2768
|
+
owasp: "ASI03",
|
|
2694
2769
|
title: "Environment sent out",
|
|
2695
2770
|
catches: "the whole environment (env, printenv, set, export -p, /proc/*/environ) handed to curl, nc or another sender, through $(\u2026), a pipe or a variable",
|
|
2696
2771
|
values: ALL,
|
|
@@ -2700,6 +2775,7 @@ var PRODUCT_CHECKS = [
|
|
|
2700
2775
|
{
|
|
2701
2776
|
id: "data.output-secrets",
|
|
2702
2777
|
group: "data",
|
|
2778
|
+
owasp: "ASI03",
|
|
2703
2779
|
title: "Secret in tool output",
|
|
2704
2780
|
catches: "a credential a tool returned; the session is tainted, nothing is stopped",
|
|
2705
2781
|
values: ["off", "log"],
|
|
@@ -2708,6 +2784,7 @@ var PRODUCT_CHECKS = [
|
|
|
2708
2784
|
{
|
|
2709
2785
|
id: "data.prompt-secrets",
|
|
2710
2786
|
group: "data",
|
|
2787
|
+
owasp: "ASI03",
|
|
2711
2788
|
title: "Secret in the prompt",
|
|
2712
2789
|
catches: "a credential pasted into the conversation",
|
|
2713
2790
|
values: ALL,
|
|
@@ -2716,6 +2793,7 @@ var PRODUCT_CHECKS = [
|
|
|
2716
2793
|
{
|
|
2717
2794
|
id: "data.canary",
|
|
2718
2795
|
group: "data",
|
|
2796
|
+
owasp: "ASI03",
|
|
2719
2797
|
title: "Decoy credential used",
|
|
2720
2798
|
catches: "a planted decoy value appears in a tool call",
|
|
2721
2799
|
values: ALL,
|
|
@@ -2726,6 +2804,7 @@ var PRODUCT_CHECKS = [
|
|
|
2726
2804
|
{
|
|
2727
2805
|
id: "network.unknown-host",
|
|
2728
2806
|
group: "network",
|
|
2807
|
+
owasp: "ASI02",
|
|
2729
2808
|
title: "Unknown host",
|
|
2730
2809
|
catches: "a destination on neither the allowlist nor the builtin list",
|
|
2731
2810
|
values: ["off", "review", "block"],
|
|
@@ -2735,6 +2814,7 @@ var PRODUCT_CHECKS = [
|
|
|
2735
2814
|
{
|
|
2736
2815
|
id: "network.internal-addresses",
|
|
2737
2816
|
group: "network",
|
|
2817
|
+
owasp: "ASI02",
|
|
2738
2818
|
title: "Internal address",
|
|
2739
2819
|
catches: "loopback, the RFC 1918 ranges and carrier-grade NAT",
|
|
2740
2820
|
values: ["off", "block"],
|
|
@@ -2743,6 +2823,7 @@ var PRODUCT_CHECKS = [
|
|
|
2743
2823
|
{
|
|
2744
2824
|
id: "network.metadata",
|
|
2745
2825
|
group: "network",
|
|
2826
|
+
owasp: "ASI02",
|
|
2746
2827
|
title: "Cloud metadata address",
|
|
2747
2828
|
catches: "169.254.169.254 and its peers, link-local and multicast",
|
|
2748
2829
|
values: ["block"],
|
|
@@ -2753,6 +2834,7 @@ var PRODUCT_CHECKS = [
|
|
|
2753
2834
|
{
|
|
2754
2835
|
id: "network.taint-egress",
|
|
2755
2836
|
group: "network",
|
|
2837
|
+
owasp: "ASI01",
|
|
2756
2838
|
title: "Tainted data sent out",
|
|
2757
2839
|
catches: "a file or an output flagged earlier in the session reaches a host not on the allowlist",
|
|
2758
2840
|
values: ALL,
|
|
@@ -2766,6 +2848,7 @@ var PRODUCT_CHECKS = [
|
|
|
2766
2848
|
{
|
|
2767
2849
|
id: "files.jail",
|
|
2768
2850
|
group: "files",
|
|
2851
|
+
owasp: "ASI03",
|
|
2769
2852
|
title: "Jailed path",
|
|
2770
2853
|
catches: "a path the workspace or the developer added to the jail",
|
|
2771
2854
|
values: ALL,
|
|
@@ -2775,6 +2858,7 @@ var PRODUCT_CHECKS = [
|
|
|
2775
2858
|
{
|
|
2776
2859
|
id: "behavior.loops",
|
|
2777
2860
|
group: "behavior",
|
|
2861
|
+
owasp: "ASI08",
|
|
2778
2862
|
title: "Runaway loop",
|
|
2779
2863
|
catches: "the same tool call repeated past the threshold inside the window",
|
|
2780
2864
|
values: ["off", "block"],
|
|
@@ -2784,6 +2868,7 @@ var PRODUCT_CHECKS = [
|
|
|
2784
2868
|
{
|
|
2785
2869
|
id: "behavior.prompt-injection",
|
|
2786
2870
|
group: "behavior",
|
|
2871
|
+
owasp: "ASI01",
|
|
2787
2872
|
title: "Prompt injection in tool output",
|
|
2788
2873
|
catches: "instructions aimed at the model inside content a tool returned",
|
|
2789
2874
|
values: ["off", "log"],
|
|
@@ -2792,6 +2877,7 @@ var PRODUCT_CHECKS = [
|
|
|
2792
2877
|
{
|
|
2793
2878
|
id: "behavior.session-taint",
|
|
2794
2879
|
group: "behavior",
|
|
2880
|
+
owasp: "ASI01",
|
|
2795
2881
|
title: "Action after tainted output",
|
|
2796
2882
|
catches: "a network call or a write after a flagged file or a flagged tool output",
|
|
2797
2883
|
values: ALL,
|
|
@@ -2801,6 +2887,7 @@ var PRODUCT_CHECKS = [
|
|
|
2801
2887
|
{
|
|
2802
2888
|
id: "behavior.untrusted-content",
|
|
2803
2889
|
group: "behavior",
|
|
2890
|
+
owasp: "ASI01",
|
|
2804
2891
|
title: "Send after reading outside content",
|
|
2805
2892
|
catches: "a send to an unknown destination, a destination found in what was read, or a destructive call after the session read an email, a web page or an issue",
|
|
2806
2893
|
values: ["off", "log", "review"],
|
|
@@ -2811,6 +2898,7 @@ var PRODUCT_CHECKS = [
|
|
|
2811
2898
|
{
|
|
2812
2899
|
id: "loading.skill-tamper",
|
|
2813
2900
|
group: "loading",
|
|
2901
|
+
owasp: "ASI04",
|
|
2814
2902
|
title: "Skill file changed",
|
|
2815
2903
|
catches: "a skill or plugin file whose hash differs from the one approved",
|
|
2816
2904
|
values: ["off", "log", "block"],
|
|
@@ -2820,6 +2908,7 @@ var PRODUCT_CHECKS = [
|
|
|
2820
2908
|
{
|
|
2821
2909
|
id: "loading.mcp-tamper",
|
|
2822
2910
|
group: "loading",
|
|
2911
|
+
owasp: "ASI04",
|
|
2823
2912
|
title: "MCP server changed",
|
|
2824
2913
|
catches: "tool definitions that differ from the pinned ones",
|
|
2825
2914
|
values: ALL,
|
|
@@ -2829,6 +2918,7 @@ var PRODUCT_CHECKS = [
|
|
|
2829
2918
|
{
|
|
2830
2919
|
id: "loading.malicious-package",
|
|
2831
2920
|
group: "loading",
|
|
2921
|
+
owasp: "ASI04",
|
|
2832
2922
|
title: "Malicious package",
|
|
2833
2923
|
catches: "an install of a package the index flags",
|
|
2834
2924
|
values: ALL,
|
|
@@ -2838,6 +2928,7 @@ var PRODUCT_CHECKS = [
|
|
|
2838
2928
|
{
|
|
2839
2929
|
id: "loading.unknown-registry",
|
|
2840
2930
|
group: "loading",
|
|
2931
|
+
owasp: "ASI04",
|
|
2841
2932
|
title: "Package from an unknown registry",
|
|
2842
2933
|
catches: "an install that names a registry on the command line (--registry, --index-url, -i, npm_config_registry=\u2026) that is not the public one, not in your npm, yarn, bun, pip or uv config and not on the allowlist",
|
|
2843
2934
|
values: ALL,
|
|
@@ -2852,6 +2943,7 @@ var PRODUCT_CHECKS = [
|
|
|
2852
2943
|
{
|
|
2853
2944
|
id: "actions.money",
|
|
2854
2945
|
group: "actions",
|
|
2946
|
+
owasp: "ASI09",
|
|
2855
2947
|
title: "Money moves",
|
|
2856
2948
|
catches: "a refund, payout, transfer, charge or withdrawal through an app with no protection of its own",
|
|
2857
2949
|
values: ALL,
|
|
@@ -2864,6 +2956,7 @@ var PRODUCT_CHECKS = [
|
|
|
2864
2956
|
{
|
|
2865
2957
|
id: "actions.access",
|
|
2866
2958
|
group: "actions",
|
|
2959
|
+
owasp: "ASI09",
|
|
2867
2960
|
title: "Accounts and access change",
|
|
2868
2961
|
catches: "a password, key, role, permission or user changed through an app with no protection of its own",
|
|
2869
2962
|
values: ALL,
|
|
@@ -2873,6 +2966,7 @@ var PRODUCT_CHECKS = [
|
|
|
2873
2966
|
{
|
|
2874
2967
|
id: "actions.publish",
|
|
2875
2968
|
group: "actions",
|
|
2969
|
+
owasp: "ASI09",
|
|
2876
2970
|
title: "Something is published",
|
|
2877
2971
|
catches: "a release, package, deploy or public post through an app with no protection of its own",
|
|
2878
2972
|
values: ALL,
|
|
@@ -2885,6 +2979,7 @@ var PRODUCT_CHECKS = [
|
|
|
2885
2979
|
{
|
|
2886
2980
|
id: "actions.settings",
|
|
2887
2981
|
group: "actions",
|
|
2982
|
+
owasp: "ASI09",
|
|
2888
2983
|
title: "Repository, account and mailbox settings change",
|
|
2889
2984
|
catches: "a repository made public, a deploy key, webhook or CI secret added, branch protection changed, mail forwarded outside or a public share link, through an app",
|
|
2890
2985
|
values: ALL,
|
|
@@ -2894,6 +2989,7 @@ var PRODUCT_CHECKS = [
|
|
|
2894
2989
|
{
|
|
2895
2990
|
id: "actions.protected-branch",
|
|
2896
2991
|
group: "actions",
|
|
2992
|
+
owasp: "ASI09",
|
|
2897
2993
|
title: "The main branch changes through an app",
|
|
2898
2994
|
catches: "a merge, a commit straight to main or master, or a CI workflow file written through an app",
|
|
2899
2995
|
values: ALL,
|
|
@@ -2921,6 +3017,10 @@ function packRows() {
|
|
|
2921
3017
|
rows.push({
|
|
2922
3018
|
id,
|
|
2923
3019
|
group: "commands",
|
|
3020
|
+
// A shield missing from the table falls back to tool misuse instead of
|
|
3021
|
+
// throwing here: this module loads on every hook call, and a mapping
|
|
3022
|
+
// omission must fail a test (owasp.spec.ts), never the gate.
|
|
3023
|
+
owasp: packRowOwasp(id, shield.name) ?? "ASI02",
|
|
2924
3024
|
title: rule.name.replace(SHIELD_RULE_NAME, "$3").replace(/-/g, " "),
|
|
2925
3025
|
catches: rule.description ?? rule.reason ?? "",
|
|
2926
3026
|
values: ALL,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@node9/proxy",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.50.0",
|
|
4
4
|
"description": "Access control for AI agents. Set what Claude Code, Codex, Gemini, Cursor and any MCP server are allowed to do, review risky actions before they run, and keep every action on the record.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
"mvdan-sh"
|
|
111
111
|
],
|
|
112
112
|
"devDependencies": {
|
|
113
|
-
"@anthropic-ai/sdk": "^
|
|
113
|
+
"@anthropic-ai/sdk": "^1.3.0",
|
|
114
114
|
"@octokit/rest": "^22.0.1",
|
|
115
115
|
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
116
116
|
"@semantic-release/git": "^10.0.1",
|