code wiki / _hdl_build / nx_sov_import_lint.nx
nx_sov_import_lint.nx source
↩ module page · 81 lines · 4332 B
1// nx_sovereignty_audit.nx -- MECHANICAL "no python/sh/java/qemu on the program path" checker. Given a list of
2// .nx source files, it reads each and flags two kinds of sovereignty leaks:
3// (1) any import whose target is NOT a .nx module (a non-sovereign dependency)
4// (2) any exec-target STRING LITERAL naming a third-party interpreter/tool -- "/bin/sh, "/bin/bash, "python,
5// "qemu, "perl, "node, "ruby, "javac, ".jar, "/usr/bin/env (anchored on the opening quote so prose /
6// comments mentioning incumbents do NOT false-positive; only actual string literals are caught)
7// Exit 0 iff EVERY file is sovereign; 1 if any is flagged. This turns "we don't ship non-sovereign deps" from a
8// promise into a repeatable gate (the gate's neg-control proves it actually detects a real leak = liar-kill).
9// nx_sovereignty_audit <file1.nx> [file2.nx ...]
10// license_tier: ORIGINAL
11import "nx_syscalls.nx"
12
13func sa_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
14func sa_strlen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
15func sa_num(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=(48 as u8);k=1}; while m>0{t[k]=((48+(m%10)) as u8);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 }
16func sa_find(buf: *u8, n: i64, pat: *u8, start: i64) -> i64 {
17 let pl: i64=sa_strlen(pat); if pl==0 { return 0-1 }
18 var i: i64=start
19 while i+pl<=n { var j: i64=0; var ok: i64=1; while j<pl { if buf[i+j]!=pat[j]{ok=0;j=pl} else {j=j+1} } if ok==1 { return i } i=i+1 }
20 return 0-1
21}
22
23// audit one file: returns 0 sovereign, 1 flagged, -1 missing
24func sa_audit(path: *u8) -> i64 {
25 let szp: *i64=sys_mmap(16) as *i64
26 let buf: *u8=sys_read_file(path, szp)
27 if (buf as i64)==0 { sa_puts(path); sa_puts(": MISSING (cannot read)\n" as *u8); return 0-1 }
28 let n: i64=szp[0]
29 var flagged: i64=0
30 sa_puts(path); sa_puts(": " as *u8)
31
32 // (2) forbidden exec-target string literals (each begins with a double-quote)
33 let M: *i64=sys_mmap(8*32) as *i64; var mc: i64=0
34 M[mc]="\"/bin/sh" as *u8 as i64; mc=mc+1
35 M[mc]="\"/bin/bash" as *u8 as i64; mc=mc+1
36 M[mc]="\"bash" as *u8 as i64; mc=mc+1
37 M[mc]="\"python" as *u8 as i64; mc=mc+1
38 M[mc]="\"qemu" as *u8 as i64; mc=mc+1
39 M[mc]="\"/usr/bin/qemu" as *u8 as i64; mc=mc+1
40 M[mc]="\"perl" as *u8 as i64; mc=mc+1
41 M[mc]="\"node" as *u8 as i64; mc=mc+1
42 M[mc]="\"ruby" as *u8 as i64; mc=mc+1
43 M[mc]="\"javac" as *u8 as i64; mc=mc+1
44 M[mc]="\".jar" as *u8 as i64; mc=mc+1
45 M[mc]="\"/usr/bin/env" as *u8 as i64; mc=mc+1
46 var i: i64=0
47 while i<mc {
48 if sa_find(buf, n, M[i] as *u8, 0)>=0 { if flagged==0 { sa_puts("FLAGGED" as *u8) } sa_puts(" [exec-literal " as *u8); sa_puts(M[i] as *u8); sa_puts("]" as *u8); flagged=1 }
49 i=i+1
50 }
51
52 // (1) every import must target a .nx module
53 var p: i64=0; var imports: i64=0
54 while 1==1 {
55 let at: i64=sa_find(buf, n, "import \"" as *u8, p)
56 if at<0 { p=0; i=mc; break }
57 imports=imports+1
58 let s: i64=at+8; var e: i64=s
59 while e<n { if buf[e]==(34 as u8) { break } e=e+1 }
60 var nx_ok: i64=0
61 if e-s>=3 { if buf[e-3]==(46 as u8) { if buf[e-2]==(110 as u8) { if buf[e-1]==(120 as u8) { nx_ok=1 } } } } // ".nx"
62 if nx_ok==0 { if flagged==0 { sa_puts("FLAGGED" as *u8) } sa_puts(" [non-nx-import]" as *u8); flagged=1 }
63 p=e+1
64 }
65
66 if flagged==0 { sa_puts("SOVEREIGN (imports=" as *u8); sa_num(imports); sa_puts(" all .nx, exec-literals=0)\n" as *u8) } else { sa_puts("\n" as *u8) }
67 return flagged
68}
69
70func main(argc: i64, argv: *i64) -> i64 {
71 if argc<2 { sa_puts("usage: nx_sovereignty_audit <file1.nx> [file2.nx ...]\n" as *u8); sys_exit(2); return 2 }
72 sa_puts("=== SOVEREIGNTY AUDIT (no python/sh/java/qemu on the program path) ===\n" as *u8)
73 var any_flag: i64=0; var i: i64=1
74 while i<argc {
75 let r: i64=sa_audit(argv[i] as *u8)
76 if r!=0 { any_flag=1 }
77 i=i+1
78 }
79 if any_flag==0 { sa_puts("AUDIT-RESULT: ALL SOVEREIGN\n" as *u8); sys_exit(0); return 0 }
80 sa_puts("AUDIT-RESULT: NON-SOVEREIGN DEPENDENCY DETECTED\n" as *u8); sys_exit(1); return 1
81}