Не нужно взламывать ядро. Это было бы относительно легко с библиотекой вставки, предполагающей способы, которые использует Боб, чтобы знать, какое время ограничено.
Например, многие команды, такие как date(1), используют clock_gettime(2) для получения текущей даты и времени. Вставляющая библиотека на лету исправит часть даты и установит ее 22 июня.
Это не будет работать со статически связанными двоичными файлами, такими как busybox, но эти двоичные файлы могут быть легко исправлены таким же образом.
Вот пример кода, демонстрирующий выполнимость:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdint.h>
#include <time.h>
#include <dlfcn.h>
#include <unistd.h>
#include <sys/types.h>
int clock_gettime(clockid_t clk_id, struct timespec *tp)
{
static int (*cgt)(clockid_t, struct timespec*) = NULL;
if (!cgt)
cgt = dlsym(RTLD_NEXT, "clock_gettime");
int rv = cgt(clk_id, tp);
if(getuid()==1000) // Assuming 1000 is bob's uid.
{
struct tm * tm=localtime(&tp->tv_sec);
tm->tm_mday=22;
tm->tm_mon=5;
time_t tt=mktime(tm);
tp->tv_sec=tt;
}
return rv;
}
И что это обеспечивает:
$ date
Wed Jun 2 23:44:51 CEST 2011
$ export LD_PRELOAD=$PWD/a.so
$ date
Wed Jun 22 23:44:51 CEST 2011
$ id -u
1000