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}