bashrs 6.66.0

Rust-to-Shell transpiler for deterministic bootstrap scripts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
pub fn non_idempotent_templates() -> Vec<AdversarialTemplate> {
    vec![
        // mkdir without -p (8)
        AdversarialTemplate {
            family: "NONIDEM-MKDIR-SIMPLE",
            target_class: 3,
            template: "mkdir \"{DIR}\"",
            params: &[ParamSlot {
                name: "DIR",
                pool: SAFE_DIRNAMES,
            }],
        },
        AdversarialTemplate {
            family: "NONIDEM-MKDIR-NESTED",
            target_class: 3,
            template: "mkdir \"{DIR}/sub\"\necho \"Created directory\"",
            params: &[ParamSlot {
                name: "DIR",
                pool: SAFE_DIRNAMES,
            }],
        },
        AdversarialTemplate {
            family: "NONIDEM-MKDIR-VAR",
            target_class: 3,
            template: "echo \"Setting up {DIR}\"\nmkdir \"{DIR}\"",
            params: &[ParamSlot {
                name: "DIR",
                pool: SAFE_DIRNAMES,
            }],
        },
        AdversarialTemplate {
            family: "NONIDEM-MKDIR-MULTI",
            target_class: 3,
            template: "mkdir \"{DIR1}\"\nmkdir \"{DIR2}\"",
            params: &[
                ParamSlot {
                    name: "DIR1",
                    pool: SAFE_DIRNAMES,
                },
                ParamSlot {
                    name: "DIR2",
                    pool: &[
                        "/opt/data",
                        "/srv/cache",
                        "/opt/work",
                        "/var/lib/run",
                        "/srv/output",
                    ],
                },
            ],
        },
        AdversarialTemplate {
            family: "NONIDEM-MKDIR-LOOP",
            target_class: 3,
            template: "mkdir \"/opt/{A}\"\nmkdir \"/opt/{B}\"\nmkdir \"/opt/{C}\"",
            params: &[
                ParamSlot {
                    name: "A",
                    pool: &["logs", "data", "cache", "tmp", "build"],
                },
                ParamSlot {
                    name: "B",
                    pool: &["output", "state", "run", "work", "stage"],
                },
                ParamSlot {
                    name: "C",
                    pool: &["backup", "archive", "export", "dist", "pkg"],
                },
            ],
        },
        AdversarialTemplate {
            family: "NONIDEM-MKDIR-INSTALL",
            target_class: 3,
            template:
                "echo \"Installing to {DIR}\"\nmkdir \"{DIR}\"\nmkdir \"{DIR}/bin\"\necho \"Done.\"",
            params: &[ParamSlot {
                name: "DIR",
                pool: &[
                    "/opt/myapp",
                    "/usr/local/app",
                    "/home/user/tool",
                    "/opt/service",
                    "/srv/deploy",
                ],
            }],
        },
        AdversarialTemplate {
            family: "NONIDEM-MKDIR-DEPLOY",
            target_class: 3,
            template: "mkdir \"{DIR}\"\nmkdir \"{DIR}/config\"\necho \"Deployed.\"",
            params: &[ParamSlot {
                name: "DIR",
                pool: SAFE_DIRNAMES,
            }],
        },
        AdversarialTemplate {
            family: "NONIDEM-MKDIR-CONDITIONAL",
            target_class: 3,
            template: "if [ \"{MODE}\" = \"init\" ]; then\n  mkdir \"{DIR}\"\nfi",
            params: &[
                ParamSlot {
                    name: "MODE",
                    pool: &["init", "setup", "install", "create", "bootstrap"],
                },
                ParamSlot {
                    name: "DIR",
                    pool: SAFE_DIRNAMES,
                },
            ],
        },
        // rm without -f (9)
        AdversarialTemplate {
            family: "NONIDEM-RM-FILE",
            target_class: 3,
            template: "rm \"{DIR}/{FILE}\"",
            params: &[
                ParamSlot {
                    name: "DIR",
                    pool: &[
                        "/opt/data",
                        "/srv/logs",
                        "/home/user",
                        "/var/lib/app",
                        "/opt/cache",
                    ],
                },
                ParamSlot {
                    name: "FILE",
                    pool: FILENAMES,
                },
            ],
        },
        AdversarialTemplate {
            family: "NONIDEM-RM-DIR",
            target_class: 3,
            template: "rm -r \"{DIR}\"",
            params: &[ParamSlot {
                name: "DIR",
                pool: SAFE_DIRNAMES,
            }],
        },
        AdversarialTemplate {
            family: "NONIDEM-RM-MULTI",
            target_class: 3,
            template: "rm \"{DIR}/{FILE1}\"\nrm \"{DIR}/{FILE2}\"",
            params: &[
                ParamSlot {
                    name: "DIR",
                    pool: &["/opt/data", "/srv/logs", "/var/lib/app", "/home/user/work"],
                },
                ParamSlot {
                    name: "FILE1",
                    pool: FILENAMES,
                },
                ParamSlot {
                    name: "FILE2",
                    pool: &["lock.pid", "socket.sock", "temp.dat", "old.bak"],
                },
            ],
        },
        AdversarialTemplate {
            family: "NONIDEM-RM-VAR",
            target_class: 3,
            template: "DEST=\"{DIR}/{FILE}\"\nrm \"${DEST}\"",
            params: &[
                ParamSlot {
                    name: "DIR",
                    pool: &["/opt/data", "/srv/logs", "/var/lib/app", "/home/user/work"],
                },
                ParamSlot {
                    name: "FILE",
                    pool: FILENAMES,
                },
            ],
        },
        AdversarialTemplate {
            family: "NONIDEM-RM-GLOB",
            target_class: 3,
            template: "rm \"{DIR}\"/*.{EXT}",
            params: &[
                ParamSlot {
                    name: "DIR",
                    pool: &["/opt/data", "/srv/logs", "/var/lib/app", "/home/user/work"],
                },
                ParamSlot {
                    name: "EXT",
                    pool: &["tmp", "bak", "log", "old", "cache"],
                },
            ],
        },
        AdversarialTemplate {
            family: "NONIDEM-RM-CLEANUP",
            target_class: 3,
            template: "echo \"Cleaning up\"\nrm \"{DIR}/{FILE}\"\necho \"Clean.\"",
            params: &[
                ParamSlot {
                    name: "DIR",
                    pool: &["/opt/data", "/srv/logs", "/var/lib/app", "/home/user/work"],
                },
                ParamSlot {
                    name: "FILE",
                    pool: FILENAMES,
                },
            ],
        },
        AdversarialTemplate {
            family: "NONIDEM-RM-CACHE",
            target_class: 3,
            template: "rm -r \"{DIR}/cache\"\necho \"Cache cleared.\"",
            params: &[ParamSlot {
                name: "DIR",
                pool: &["/var/lib", "/opt/app", "/home/user/.local", "/srv", "/opt"],
            }],
        },
        AdversarialTemplate {
            family: "NONIDEM-RM-CONDITIONAL",
            target_class: 3,
            template: "if [ \"{ACTION}\" = \"clean\" ]; then\n  rm \"{DIR}/{FILE}\"\nfi",
            params: &[
                ParamSlot {
                    name: "ACTION",
                    pool: &["clean", "reset", "purge", "clear", "wipe"],
                },
                ParamSlot {
                    name: "DIR",
                    pool: &["/opt/data", "/srv/logs", "/var/lib/app", "/home/user/work"],
                },
                ParamSlot {
                    name: "FILE",
                    pool: FILENAMES,
                },
            ],
        },
        AdversarialTemplate {
            family: "NONIDEM-RM-LOOP",
            target_class: 3,
            template: "for f in {A} {B} {C}; do\n  rm \"$f\"\ndone",
            params: &[
                ParamSlot {
                    name: "A",
                    pool: &["old.log", "cache.db", "temp.txt", "lock.pid", "run.sock"],
                },
                ParamSlot {
                    name: "B",
                    pool: &[
                        "state.dat",
                        "session.tmp",
                        "token.key",
                        "pid.lock",
                        "flag.set",
                    ],
                },
                ParamSlot {
                    name: "C",
                    pool: &["dump.sql", "trace.out", "core.err", "heap.prof", "gc.log"],
                },
            ],
        },
        // ln -s without -f (8)
        AdversarialTemplate {
            family: "NONIDEM-LN-SIMPLE",
            target_class: 3,
            template: "ln -s \"{TARGET}\" \"{LINK}\"",
            params: &[
                ParamSlot {
                    name: "TARGET",
                    pool: LINK_TARGETS,
                },
                ParamSlot {
                    name: "LINK",
                    pool: LINK_NAMES,
                },
            ],
        },
        AdversarialTemplate {
            family: "NONIDEM-LN-VERSION",
            target_class: 3,
            template: "ln -s \"/opt/{APP}/v{VER}\" \"/opt/{APP}/current\"",
            params: &[
                ParamSlot {
                    name: "APP",
                    pool: &["myapp", "service", "tool", "daemon", "agent"],
                },
                ParamSlot {
                    name: "VER",
                    pool: &["1.0", "2.0", "3.1", "4.0", "1.5"],
                },
            ],
        },
        AdversarialTemplate {
            family: "NONIDEM-LN-DOTFILE",
            target_class: 3,
            template: "ln -s \"{TARGET}\" \"/home/user/.{NAME}\"",
            params: &[
                ParamSlot {
                    name: "TARGET",
                    pool: &[
                        "/etc/app/config",
                        "/opt/tool/rc",
                        "/usr/share/defaults/conf",
                        "/var/lib/settings",
                        "/srv/config/main",
                    ],
                },
                ParamSlot {
                    name: "NAME",
                    pool: &["apprc", "toolrc", "config", "profile", "settings"],
                },
            ],
        },
        AdversarialTemplate {
            family: "NONIDEM-LN-BIN",
            target_class: 3,
            template: "ln -s \"/opt/{APP}/bin/{APP}\" \"/usr/local/bin/{APP}\"",
            params: &[ParamSlot {
                name: "APP",
                pool: &["myapp", "tool", "cli", "daemon", "agent"],
            }],
        },
        AdversarialTemplate {
            family: "NONIDEM-LN-RELATIVE",
            target_class: 3,
            template: "ln -s \"/opt/{SRC}\" \"{DIR}/{LINK}\"",
            params: &[
                ParamSlot {
                    name: "SRC",
                    pool: &[
                        "shared/lib",
                        "common/config",
                        "base/data",
                        "core/assets",
                        "vendor/deps",
                    ],
                },
                ParamSlot {
                    name: "DIR",
                    pool: &[
                        "/opt/app",
                        "/srv/deploy",
                        "/var/lib/svc",
                        "/home/user/proj",
                        "/opt/build",
                    ],
                },
                ParamSlot {
                    name: "LINK",
                    pool: &["lib", "config", "data", "assets", "deps"],
                },
            ],
        },
        AdversarialTemplate {
            family: "NONIDEM-LN-CONFIG",
            target_class: 3,
            template: "ln -s \"/etc/{APP}/{FILE}\" \"/opt/{APP}/config/{FILE}\"",
            params: &[
                ParamSlot {
                    name: "APP",
                    pool: &["myapp", "service", "tool", "daemon", "agent"],
                },
                ParamSlot {
                    name: "FILE",
                    pool: &[
                        "app.conf",
                        "settings.yaml",
                        "config.toml",
                        "env.sh",
                        "params.json",
                    ],
                },
            ],
        },
        AdversarialTemplate {
            family: "NONIDEM-LN-MULTI",
            target_class: 3,
            template: "ln -s \"{TARGET1}\" \"{LINK1}\"\nln -s \"{TARGET2}\" \"{LINK2}\"",
            params: &[
                ParamSlot {
                    name: "TARGET1",
                    pool: LINK_TARGETS,
                },
                ParamSlot {
                    name: "LINK1",
                    pool: LINK_NAMES,
                },
                ParamSlot {
                    name: "TARGET2",
                    pool: &[
                        "/opt/lib/libapp.so",
                        "/usr/share/app/data",
                        "/var/lib/app/state",
                        "/etc/app/defaults",
                        "/srv/app/assets",
                    ],
                },
                ParamSlot {
                    name: "LINK2",
                    pool: &[
                        "/usr/lib/libapp.so",
                        "/opt/app/data",
                        "/var/app/state",
                        "/etc/defaults",
                        "/srv/assets",
                    ],
                },
            ],
        },
        AdversarialTemplate {
            family: "NONIDEM-LN-COMBO",
            target_class: 3,
            template: "mkdir \"{DIR}\"\nln -s \"{TARGET}\" \"{DIR}/link\"",
            params: &[
                ParamSlot {
                    name: "DIR",
                    pool: SAFE_DIRNAMES,
                },
                ParamSlot {
                    name: "TARGET",
                    pool: LINK_TARGETS,
                },
            ],
        },
    ]
}

// ── Class 4: Unsafe templates (25) ─────────────────────────────────────


include!("adversarial_templates_unsafe.rs");