Não há necessidade de hackear o kernel. Isso seria relativamente fácil com uma biblioteca de interposição, assumindo que as formas que Bob usa para saber o tempo são limitadas.
Por exemplo, muitos comandos como date (1) estão usando clock_gettime (2) para obter a data e a hora atuais. Uma biblioteca interposta corrigia a data e definia a data de 22 de junho.
Isso não funciona com binários vinculados estaticamente, como o busybox, mas esses binários podem ser facilmente corrigidos da mesma maneira.
Aqui está um código de exemplo que demonstra a viabilidade:
#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;
}
E o que ele oferece:
$ 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