14019bf7d9eef9336e1e3b4ca91b276782ea3183
[oweals/busybox.git] / NOFORK_NOEXEC.lst
1 Why an applet can't be NOFORK or NOEXEC?
2
3 Why can't be NOFORK:
4 interactive: may wait for user input, ^C has to work
5 spawner: "tool PROG ARGS" which changes program's environment - must fork
6 changes state: e.g. environment, signal handlers
7 alloc+xfunc: xmalloc, then xfunc - leaks memory if xfunc dies
8 open+xfunc: opens fd, then calls xfunc - fd is leaked if xfunc dies
9 runner: sometimes may run for long(ish) time, and/or works with network:
10         ^C has to work (cat BIGFILE, chmod -R, ftpget, nc)
11
12 "runners" can become eligible after shell is taught ^C to interrupt NOFORKs!
13
14 Why can't be NOEXEC:
15 suid: runs under different uid - must fork+exec
16
17 Why shouldn't be NOFORK/NOEXEC:
18 complex: no immediately obvious reason why NOFORK wouldn't work,
19         but does some non-obvoius operations (example: fuser, lsof, losetup);
20         nested xmallocs (typical in complex code) is a problem for NOFORK
21 rare: not used often enough to bother optimizing (example: poweroff)
22 longterm: often runs for a long time (many seconds), execing would make
23         memory footprint smaller
24 daemon: runs indefinitely
25
26 [ - NOFORK
27 [[ - NOFORK
28 acpid - daemon
29 add-shell
30 addgroup
31 adduser
32 adjtimex
33 ar - runner
34 arch - NOFORK
35 arp
36 arping - runner
37 ash - interactive
38 awk - noexec. runner
39 base64 - runner
40 basename - NOFORK
41 beep
42 blkdiscard
43 blkid
44 blockdev
45 bootchartd - daemon
46 brctl
47 bunzip2 - runner
48 busybox
49 bzcat - runner
50 bzip2 - runner
51 cal - runner: cal -n9999
52 cat - runner
53 chat
54 chattr - runner
55 chgrp - noexec. runner
56 chmod - noexec. runner
57 chown - noexec. runner
58 chpasswd - runner (list of "user:password"s from stdin)
59 chpst - spawner
60 chroot - spawner
61 chrt - spawner
62 chvt
63 cksum - noexec. runner
64 clear - NOFORK
65 cmp - runner
66 comm - runner
67 conspy - interactive
68 cp - noexec. runner
69 cpio - runner
70 crond - daemon
71 crontab
72 cryptpw
73 cttyhack - spawner
74 cut - noexec. runner
75 date - noexec. nofork candidate(needs to stop messing up env, free xasprintf result, not use xfuncs after xasprintf)
76 dc - runner (eats stdin if no params)
77 dd - noexec. runner
78 deallocvt
79 delgroup
80 deluser
81 depmod
82 devmem - runner, complex (access to device memory may hang)
83 df - complex (nested allocs)
84 dhcprelay - daemon
85 diff - runner
86 dirname - NOFORK
87 dmesg - runner
88 dnsd - daemon
89 dnsdomainname - DNS resolution may trigger, need ^C
90 dos2unix - noexec. runner
91 dpkg - runner
92 du - runner
93 dumpkmap
94 dumpleases
95 echo - NOFORK
96 ed - interactive
97 egrep - runner
98 eject
99 env - noexec. changes state (env)
100 envdir - spawner
101 envuidgid - spawner
102 expand - runner
103 expr - complex (nested allocs)
104 factor - runner (eats stdin if no params)
105 fakeidentd - daemon
106 false - NOFORK
107 fatattr - complex (xopen+xioctl can leak fd)
108 fbset
109 fbsplash - runner, interactive
110 fdflush
111 fdformat - runner
112 fdisk - interactive
113 fgconsole
114 fgrep - runner
115 find - noexec. runner
116 findfs - suid
117 flash_eraseall
118 flash_lock
119 flash_unlock
120 flashcp
121 flock
122 fold - noexec. runner
123 free - nofork candidate(struct globals, needs to close /proc/meminfo fd)
124 freeramdisk
125 fsck - interactive
126 fsck.minix
127 fsfreeze
128 fstrim
129 fsync - NOFORK
130 ftpd - daemon
131 ftpget - runner
132 ftpput - runner
133 fuser - complex
134 getopt - noexec. complex (many allocs)
135 getty - interactive
136 grep - runner
137 groups - noexec
138 gunzip - runner
139 gzip - runner
140 halt - rare
141 hd - noexec. runner
142 hdparm - complex, rare
143 head - noexec. runner
144 hexdump - noexec. runner
145 hostid - NOFORK
146 hostname - DNS resolution may trigger, need ^C
147 httpd - daemon
148 hush - interactive
149 hwclock
150 i2cdetect
151 i2cdump
152 i2cget
153 i2cset
154 id - noexec
155 ifconfig
156 ifenslave
157 ifplugd - daemon
158 inetd - daemon
159 init - daemon
160 inotifyd - daemon
161 insmod - noexec
162 install - runner
163 ionice - spawner
164 iostat - runner
165 ip - noexec candidate
166 ipaddr - noexec candidate
167 ipcalc - noexec candidate
168 ipcrm - noexec candidate
169 ipcs - noexec candidate
170 iplink - noexec candidate
171 ipneigh - noexec candidate
172 iproute - noexec candidate
173 iprule - noexec candidate
174 iptunnel - noexec candidate
175 kbd_mode
176 kill - NOFORK
177 killall - NOFORK
178 killall5 - NOFORK
179 klogd - daemon
180 last - runner (I've got 1300 lines of output when tried it)
181 less - interactive
182 link - NOFORK
183 linux32 - spawner
184 linux64 - spawner
185 linuxrc - daemon
186 ln - noexec
187 loadfont
188 loadkmap
189 logger - runner
190 login - suid, interactive
191 logname - NOFORK
192 losetup - complex
193 lpd - daemon
194 lpq - runner
195 lpr - runner
196 ls - noexec. runner
197 lsattr
198 lsmod - noexec
199 lsof - complex
200 lspci
201 lsscsi
202 lsusb
203 lzcat - runner
204 lzma - runner
205 lzop - runner
206 lzopcat - runner
207 makedevs
208 makemime - runner
209 man - spawner, interactive
210 md5sum - noexec. runner
211 mdev - daemon
212 mesg
213 microcom - interactive, complex
214 mkdir - NOFORK
215 mkdosfs
216 mke2fs
217 mkfifo - noexec
218 mkfs.ext2
219 mkfs.minix
220 mkfs.vfat
221 mknod - noexec
222 mkpasswd
223 mkswap
224 mktemp
225 modinfo - noexec
226 modprobe - noexec
227 more - interactive
228 mount - suid
229 mountpoint
230 mpstat
231 mt
232 mv - runner (can be noexec?)
233 nameif
234 nbd-client
235 nc - runner
236 netstat - runner with -c
237 nice - spawner
238 nl - runner
239 nmeter - runner
240 nohup - spawner
241 nproc - NOFORK
242 ntpd - daemon
243 od - runner
244 openvt - spawner
245 partprobe
246 passwd - suid
247 paste - noexec. runner
248 patch
249 pgrep - nofork candidate(xregcomp, procps_scan - are they ok?)
250 pidof - nofork candidate(uses find_pid_by_name, is that ok?)
251 ping - suid, runner
252 ping6 - suid, runner
253 pipe_progress
254 pivot_root
255 pkill - nofork candidate(xregcomp, procps_scan - are they ok?)
256 pmap
257 popmaildir - runner
258 poweroff - rare
259 powertop - interactive, longterm
260 printenv - NOFORK
261 printf - NOFORK
262 ps - noexec candidate
263 pscan - longterm
264 pstree
265 pwd - NOFORK
266 pwdx - NOFORK
267 raidautorun
268 rdate
269 rdev
270 readlink - NOFORK
271 readprofile
272 realpath - NOFORK
273 reboot - rare
274 reformime - runner
275 remove-shell
276 renice - nofork candidate(uses getpwnam, is that ok?)
277 reset - spawner (execs "stty")
278 resize - noexec. changes state (signal handlers)
279 rev - runner
280 rm - noexec. rm -i interactive
281 rmdir - NOFORK
282 rmmod - noexec
283 route
284 rpm - runner
285 rpm2cpio - runner
286 rtcwake - complex, rare
287 run-parts
288 runlevel
289 runsv - daemon
290 runsvdir - daemon
291 rx - runner
292 script
293 scriptreplay
294 sed - runner
295 sendmail - runner
296 seq - noexec. runner
297 setarch - spawner
298 setconsole
299 setfont
300 setkeycodes
301 setlogcons
302 setpriv - spawner
303 setserial
304 setsid - spawner
305 setuidgid
306 sh - interactive
307 sha1sum - noexec. runner
308 sha256sum - noexec. runner
309 sha3sum - noexec. runner
310 sha512sum - noexec. runner
311 showkey - interactive
312 shred - runner
313 shuf - noexec. runner
314 slattach
315 sleep - runner
316 smemcap - runner
317 softlimit - spawner
318 sort - noexec. runner
319 split - runner
320 ssl_client - network
321 start-stop-daemon
322 stat - nofork candidate(needs fewer allocs)
323 strings - runner
324 stty
325 su - suid, spawner
326 sulogin - spawner
327 sum - runner
328 sv
329 svc
330 svlogd - daemon
331 swapoff - rare
332 swapon - rare
333 switch_root - spawner, rare, changes state
334 sync - NOFORK
335 sysctl
336 syslogd - daemon
337 tac - noexec. runner
338 tail - runner
339 tar - runner
340 taskset - spawner
341 tcpsvd - daemon
342 tee - runner
343 telnet - interactive
344 telnetd - daemon
345 test - NOFORK
346 tftp - runner
347 tftpd - daemon
348 time - spawner, changes state (signals)
349 timeout - spawner, changes state (signals)
350 top - interactive, longterm
351 touch - NOFORK
352 tr - runner
353 traceroute - suid, runner
354 traceroute6 - suid, runner
355 true - NOFORK
356 truncate - NOFORK
357 tty - NOFORK
358 ttysize - NOFORK
359 tunctl
360 tune2fs
361 ubiattach
362 ubidetach
363 ubimkvol
364 ubirename
365 ubirmvol
366 ubirsvol
367 ubiupdatevol
368 udhcpc - daemon
369 udhcpd - daemon
370 udpsvd - daemon
371 uevent - daemon
372 umount
373 uname - NOFORK
374 uncompress - runner
375 unexpand - runner
376 uniq - runner
377 unix2dos - noexec. runner
378 unlink - NOFORK
379 unlzma - runner
380 unlzop - runner
381 unxz - runner
382 unzip - runner
383 uptime - nofork candidate(is getutxent ok?)
384 users - nofork candidate(is getutxent ok?)
385 usleep - NOFORK
386 uudecode - runner
387 uuencode - runner
388 vconfig
389 vi - interactive
390 vlock - suid
391 volname - runner
392 w
393 wall - suid
394 watch - runner
395 watchdog - daemon
396 wc - runner
397 wget - runner
398 which - NOFORK
399 who
400 whoami - NOFORK
401 whois
402 xargs - noexec. spawner
403 xxd - noexec. runner
404 xz - runner
405 xzcat - runner
406 yes - noexec. runner
407 zcat - runner
408 zcip - daemon