code wiki / _hdl_build / nx_adnet_slot_gate.nx
nx_adnet_slot_gate.nx source
↩ module page · 197 lines · 10525 B
1// nx_adnet_slot_gate.nx -- GATE for the universal ad slot lib (nx_adnet_slot). Proves: section derive,
2// FAIL-CLOSED host directive, rotation pick, honest labeled render, ESCAPE + first-party-only validation
3// (planted <script advertiser stays escaped; third-party img and javascript: click rows are DROPPED),
4// any-section fallback, first-party click 302 (unknown/invalid id -> /), and that the forbidden-byte
5// detectors FIRE on planted vectors (anti-false-green). Zero visitor identity anywhere.
6// expect_exit: 0 license_tier: ORIGINAL
7import "nx_syscalls.nx"
8import "nx_g_puts_lib.nx"
9import "_hdl_build/nx_adnet_slot.nx"
10
11func g_putn(v: i64) -> i64 { var m: i64 = v; if m < 0 { g_puts("-" as *u8); m = 0 - m } let t: *u8 = sys_mmap(24); 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 } let o: *u8 = sys_mmap(24); var i: i64 = 0; while i < k { o[i] = t[k - 1 - i]; i = i + 1 } sys_write(1, o, k); return 0 }
12
13func g_cat(dst: *u8, off: i64, s: *u8) -> i64 { var o: i64 = off; var i: i64 = 0; while s[i] != (0 as u8) { dst[o] = s[i]; o = o + 1; i = i + 1 } return o }
14func g_tab(dst: *u8, off: i64) -> i64 { dst[off] = 9 as u8; return off + 1 }
15func g_nl(dst: *u8, off: i64) -> i64 { dst[off] = 10 as u8; return off + 1 }
16
17// substring scan: 1 if needle (NUL-terminated) occurs in hay[0..n)
18func g_has(hay: *u8, n: i64, needle: *u8) -> i64 {
19 var nl: i64 = 0
20 while needle[nl] != (0 as u8) { nl = nl + 1 }
21 if nl == 0 { return 0 }
22 var i: i64 = 0
23 while i + nl <= n {
24 var j: i64 = 0
25 var eq: i64 = 1
26 while j < nl { if hay[i + j] != needle[j] { eq = 0; break } j = j + 1 }
27 if eq == 1 { return 1 }
28 i = i + 1
29 }
30 return 0
31}
32
33func g_row6(dst: *u8, off: i64, f0: *u8, f1: *u8, f2: *u8, f3: *u8, f4: *u8, f5: *u8) -> i64 {
34 var o: i64 = off
35 o = g_cat(dst, o, f0)
36 o = g_tab(dst, o)
37 o = g_cat(dst, o, f1)
38 o = g_tab(dst, o)
39 o = g_cat(dst, o, f2)
40 o = g_tab(dst, o)
41 o = g_cat(dst, o, f3)
42 o = g_tab(dst, o)
43 o = g_cat(dst, o, f4)
44 o = g_tab(dst, o)
45 o = g_cat(dst, o, f5)
46 o = g_nl(dst, o)
47 return o
48}
49
50func main() -> i64 {
51 g_puts("=== nx_adnet_slot_gate ===\n" as *u8)
52 var pass: i64 = 0
53 var fail: i64 = 0
54
55 // ---- build the test inventory (programmatic tabs/newlines; no escape dependence) ----
56 let inv: *u8 = sys_mmap(8192)
57 var n: i64 = 0
58 n = g_cat(inv, n, "@host" as *u8)
59 n = g_tab(inv, n)
60 n = g_cat(inv, n, "nishifamily.com" as *u8)
61 n = g_nl(inv, n)
62 n = g_row6(inv, n, "h1" as *u8, "HomeCo" as *u8, "/adnet/h1.png" as *u8, "https://example.com/h1" as *u8, "home" as *u8, "1" as *u8)
63 n = g_row6(inv, n, "h2" as *u8, "OtherCo" as *u8, "/adnet/h2.png" as *u8, "/torrent" as *u8, "home" as *u8, "1" as *u8)
64 n = g_row6(inv, n, "v1" as *u8, "VidCo" as *u8, "/adnet/v1.png" as *u8, "https://example.com/v1" as *u8, "video" as *u8, "1" as *u8)
65 n = g_row6(inv, n, "evil" as *u8, "<script>alert(1)</script>" as *u8, "/adnet/e.png" as *u8, "https://example.com/e" as *u8, "esc" as *u8, "1" as *u8)
66 n = g_row6(inv, n, "bad1" as *u8, "EvilImg" as *u8, "https://evil.example/x.png" as *u8, "https://example.com/b" as *u8, "badimg" as *u8, "1" as *u8)
67 n = g_row6(inv, n, "bad2" as *u8, "EvilClick" as *u8, "/adnet/b2.png" as *u8, "javascript:alert(1)" as *u8, "badclick" as *u8, "1" as *u8)
68 n = g_row6(inv, n, "fb" as *u8, "FallbackCo" as *u8, "/adnet/fb.png" as *u8, "/library" as *u8, "any" as *u8, "1" as *u8)
69
70 // ---- T1 section derive ----
71 let sec: *u8 = sys_mmap(128)
72 aslot_section_of("/" as *u8, 1, sec, 128)
73 if ad_streq(sec, "home" as *u8) == 1 { pass = pass + 1 } else { fail = fail + 1; g_puts("T1a FAIL root section\n" as *u8) }
74 aslot_section_of("/video/index.html" as *u8, 17, sec, 128)
75 if ad_streq(sec, "video" as *u8) == 1 { pass = pass + 1 } else { fail = fail + 1; g_puts("T1b FAIL video section\n" as *u8) }
76 aslot_section_of("/compare/llm" as *u8, 12, sec, 128)
77 if ad_streq(sec, "compare" as *u8) == 1 { pass = pass + 1 } else { fail = fail + 1; g_puts("T1c FAIL compare section\n" as *u8) }
78
79 // ---- T2 host directive FAIL-CLOSED ----
80 let hok1: i64 = aslot_host_ok(inv, n, "nishifamily.com" as *u8)
81 if hok1 == 1 { pass = pass + 1 } else { fail = fail + 1; g_puts("T2a FAIL enabled host\n" as *u8) }
82 let hok2: i64 = aslot_host_ok(inv, n, "andelinwest.com" as *u8)
83 if hok2 == 0 { pass = pass + 1 } else { fail = fail + 1; g_puts("T2b FAIL non-enabled host\n" as *u8) }
84 let noinv: *u8 = sys_mmap(64)
85 var nn: i64 = 0
86 nn = g_row6(noinv, nn, "x" as *u8, "X" as *u8, "/x.png" as *u8, "/x" as *u8, "home" as *u8, "1" as *u8)
87 let hok3: i64 = aslot_host_ok(noinv, nn, "nishifamily.com" as *u8)
88 if hok3 == 0 { pass = pass + 1 } else { fail = fail + 1; g_puts("T2c FAIL no-directive fail-closed\n" as *u8) }
89
90 // ---- T3 rotation pick + labeled render ----
91 let out: *u8 = sys_mmap(8192)
92 let idb: *u8 = sys_mmap(128)
93 let w0: i64 = aslot_html(inv, n, "/" as *u8, 1, 0, out, 8192, idb)
94 var t3: i64 = 1
95 if w0 <= 0 { t3 = 0 }
96 if g_has(out, w0, "/ad/click/h1" as *u8) == 0 { t3 = 0 }
97 if g_has(out, w0, "BROUGHT TO YOU BY" as *u8) == 0 { t3 = 0 }
98 if g_has(out, w0, "nx-ad-slot" as *u8) == 0 { t3 = 0 }
99 if ad_streq(idb, "h1" as *u8) == 0 { t3 = 0 }
100 if t3 == 1 { pass = pass + 1 } else { fail = fail + 1; g_puts("T3a FAIL rot0 render\n" as *u8) }
101 let w1: i64 = aslot_html(inv, n, "/" as *u8, 1, 1, out, 8192, idb)
102 var t3b: i64 = 1
103 if w1 <= 0 { t3b = 0 }
104 if g_has(out, w1, "/ad/click/h2" as *u8) == 0 { t3b = 0 }
105 if ad_streq(idb, "h2" as *u8) == 0 { t3b = 0 }
106 if t3b == 1 { pass = pass + 1 } else { fail = fail + 1; g_puts("T3b FAIL rot1 render\n" as *u8) }
107 let w2: i64 = aslot_html(inv, n, "/video/index.html" as *u8, 17, 0, out, 8192, idb)
108 var t3c: i64 = 1
109 if w2 <= 0 { t3c = 0 }
110 if g_has(out, w2, "/ad/click/v1" as *u8) == 0 { t3c = 0 }
111 if t3c == 1 { pass = pass + 1 } else { fail = fail + 1; g_puts("T3c FAIL section-targeted render\n" as *u8) }
112
113 // ---- T4 escape + validation kills ----
114 let w3: i64 = aslot_html(inv, n, "/esc/x" as *u8, 6, 0, out, 8192, idb)
115 var t4: i64 = 1
116 if w3 <= 0 { t4 = 0 }
117 if g_has(out, w3, "<script" as *u8) == 0 { t4 = 0 }
118 if g_has(out, w3, "<script" as *u8) == 1 { t4 = 0 }
119 if t4 == 1 { pass = pass + 1 } else { fail = fail + 1; g_puts("T4a FAIL advertiser escape\n" as *u8) }
120 let w4: i64 = aslot_html(inv, n, "/badimg/x" as *u8, 9, 0, out, 8192, idb)
121 if w4 == 0 { pass = pass + 1 } else { fail = fail + 1; g_puts("T4b FAIL third-party img not dropped\n" as *u8) }
122 let w5: i64 = aslot_html(inv, n, "/badclick/x" as *u8, 11, 0, out, 8192, idb)
123 if w5 == 0 { pass = pass + 1 } else { fail = fail + 1; g_puts("T4c FAIL javascript click not dropped\n" as *u8) }
124
125 // ---- T5 any-section fallback ----
126 let w6: i64 = aslot_html(inv, n, "/nomatch/zone" as *u8, 13, 0, out, 8192, idb)
127 var t5: i64 = 1
128 if w6 <= 0 { t5 = 0 }
129 if g_has(out, w6, "/ad/click/fb" as *u8) == 0 { t5 = 0 }
130 if t5 == 1 { pass = pass + 1 } else { fail = fail + 1; g_puts("T5 FAIL any fallback\n" as *u8) }
131
132 // ---- T6 click responder ----
133 let cw0: i64 = aslot_click_resp(inv, n, "/ad/click/h1" as *u8, 12, out, 8192, idb)
134 var t6: i64 = 1
135 if cw0 <= 0 { t6 = 0 }
136 if g_has(out, cw0, "302 Found" as *u8) == 0 { t6 = 0 }
137 if g_has(out, cw0, "Location: https://example.com/h1" as *u8) == 0 { t6 = 0 }
138 if ad_streq(idb, "h1" as *u8) == 0 { t6 = 0 }
139 if t6 == 1 { pass = pass + 1 } else { fail = fail + 1; g_puts("T6a FAIL click resolve\n" as *u8) }
140 let cw1: i64 = aslot_click_resp(inv, n, "/ad/click/zzz" as *u8, 13, out, 8192, idb)
141 var t6b: i64 = 1
142 if cw1 <= 0 { t6b = 0 }
143 if g_has(out, cw1, "Location: /\r" as *u8) == 0 { t6b = 0 }
144 if idb[0] != (0 as u8) { t6b = 0 }
145 if t6b == 1 { pass = pass + 1 } else { fail = fail + 1; g_puts("T6b FAIL unknown id fallback\n" as *u8) }
146 let cw2: i64 = aslot_click_resp(inv, n, "/ad/click/h1%22x" as *u8, 16, out, 8192, idb)
147 var t6c: i64 = 1
148 if cw2 <= 0 { t6c = 0 }
149 if g_has(out, cw2, "Location: /\r" as *u8) == 0 { t6c = 0 }
150 if t6c == 1 { pass = pass + 1 } else { fail = fail + 1; g_puts("T6c FAIL invalid id charset\n" as *u8) }
151 let cw3: i64 = aslot_click_resp(inv, n, "/video/index.html" as *u8, 17, out, 8192, idb)
152 if cw3 == 0 { pass = pass + 1 } else { fail = fail + 1; g_puts("T6d FAIL non-click path\n" as *u8) }
153
154 // ---- T7 detectors FIRE on planted vectors (anti-false-green) ----
155 var t7: i64 = 1
156 let bad_url: *u8 = "/x\" onload=\"y" as *u8
157 if aslot_url_chars_ok(bad_url) == 1 { t7 = 0 }
158 if aslot_id_ok("a b" as *u8) == 1 { t7 = 0 }
159 if aslot_img_ok("//evil.example/x.png" as *u8) == 1 { t7 = 0 }
160 if aslot_click_ok("data:text/html;base64,x" as *u8) == 1 { t7 = 0 }
161 if t7 == 1 { pass = pass + 1 } else { fail = fail + 1; g_puts("T7 FAIL detector did not fire\n" as *u8) }
162
163 // ---- T8 zero visitor identity in emitted bytes ----
164 let w8: i64 = aslot_html(inv, n, "/" as *u8, 1, 0, out, 8192, idb)
165 var t8: i64 = 1
166 if g_has(out, w8, "Set-Cookie" as *u8) == 1 { t8 = 0 }
167 if g_has(out, w8, "document.cookie" as *u8) == 1 { t8 = 0 }
168 if g_has(out, w8, "<script" as *u8) == 1 { t8 = 0 }
169 if t8 == 1 { pass = pass + 1 } else { fail = fail + 1; g_puts("T8 FAIL identity/script leak\n" as *u8) }
170
171 g_puts("pass=" as *u8)
172 g_putn(pass)
173 g_puts(" fail=" as *u8)
174 g_putn(fail)
175 g_puts("\n" as *u8)
176
177 let log: *u8 = sys_mmap(512)
178 var lo: i64 = 0
179 lo = g_cat(log, lo, "ADNETSLOT authored=organ pass=" as *u8)
180 let dg: *u8 = sys_mmap(24)
181 var dv: i64 = pass
182 var dk: i64 = 0
183 if dv == 0 { dg[0] = 48 as u8; dk = 1 }
184 while dv > 0 { dg[dk] = (48 + (dv % 10)) as u8; dv = dv / 10; dk = dk + 1 }
185 var di: i64 = dk - 1
186 while di >= 0 { log[lo] = dg[di]; lo = lo + 1; di = di - 1 }
187 if fail == 0 { lo = g_cat(log, lo, " verdict=GREEN" as *u8) } else { lo = g_cat(log, lo, " verdict=RED" as *u8) }
188 log[lo] = 10 as u8
189 lo = lo + 1
190 let fd: i64 = sys_openat_wr("knowledge/status/adnet_slot.log" as *u8, 0x1A4)
191 if fd >= 0 { sys_write(fd, log, lo); sys_close(fd) }
192
193 if fail == 0 { g_puts("=== ADNET-SLOT-GATE verdict=GREEN ===\n" as *u8); sys_exit(0); return 0 }
194 g_puts("=== ADNET-SLOT-GATE verdict=RED ===\n" as *u8)
195 sys_exit(1)
196 return 1
197}