Package: cron
Version: 3.0pl1-105
It is possible to hide scheduled tasks inside a cron table by using control
characters '\r' and '\b', example:
$ crontab -l
no crontab for alice
$ printf "* * * * * >/tmp/x;\rno crontab for alice\n" | crontab -
// new task (">/tmp/x") is hidden because of the carriage return char
$ crontab -l
no crontab for alice
// even for root
# crontab -l -u alice
no crontab for alice
[ and one minute later ... ]
# ls -l /tmp/x
-rw-r--r-- 1 alice alice 0 juin 2 22:27 /tmp/x
>From a security side, this thing could also allow someone to hide a
backdoor (example: http://vladz.devzero.fr/other/hide-task.sh.txt).
I suggest that the crontab command rejects control characters which can be
used to hide strings (mostly carriage return '\r' and backspace '\b'
characters). I wrote a small patch for this (attached file), let me know if
more improvements are needed.
I am using Debian version 5.0.4 (kernel 2.6.26-2-686).
--- crontab.c 2010-06-11 13:57:08.000000000 +0000
+++ crontab.c.orig 2010-06-11 13:51:13.000000000 +0000
@@ -823,8 +823,19 @@
*/
rewind(NewCrontab);
Set_LineNum(1)
- while (EOF != (ch = get_char(NewCrontab)))
+ while (EOF != (ch = get_char(NewCrontab))) {
+ /* Do not accept carriage return and backspace characters
+ * because they could be used to hide scheduled tasks.
+ */
+ if(ch == '\r' || ch == '\b') {
+ fprintf(stderr, "%s: Some control characters are not allowed\n",
+ ProgramName);
+ fclose(tmp); unlink(tn);
+ return (-2);
+ }
+
putc(ch, tmp);
+ }
if (ferror(tmp) || fflush(tmp) || fsync(fd)) {
fprintf(stderr, "%s: error while writing new crontab to %s\n",