La ley AB 1043 (Digital Age Assurance Act) de California en el kernel de Linux

2 de abril de 2026 • fjbalon

En el día de ayer, se ha visto publicado en el Linux Kernel Mail List un correo que detalla un parche muy llamativo: [PATCH] vfs: require verified birth date for file creation.

En él, Brauner detalla que, por la nueva regulación, todo el contenido digital, incluido las operaciones de creación de archivos deben ser realizadas por adultos verificados, ¡la creación de archivos!. Ya que la creación de archivos es la más primitiva y fundamental forma de creación de contenido en un sistema operativo, por lo que va regulado por la VFS.

El parche introduce CONFIG_VFS_AGE_VERIFICATION que, cuando está habilitado, requiere que todos los procesos registren una fecha de nacimiento válida a través de prctl(PR_SET_BIRTHDATE) antes de que se le permita crear archivos. La fecha de nacimiento se almacena en struct task_struct y se hereda a través de fork().

La creación del archivo fallará con el nuevo código de error ETOOYOUNG si:

a. No se ha registrado fecha de nacimiento.

b. La fecha de nacimiento registrada indica que el usuario es menor de 18 años.

Se ha añadido el nuevo errno, ETOOYOUNG (134). De esta forma el espacio de usuario o la propia distribución pueda manejar el error mostrando un mensaje tranquilizador. El autor sugiere «se requiere un padre o tutor legal que cree el archivo en su nombre».

Aquí está todo el código del diff para quien le interese:

@@ -42,6 +42,23 @@ source "fs/crypto/Kconfig"
 source "fs/verity/Kconfig"
 source "fs/notify/Kconfig"

+config VFS_AGE_VERIFICATION
+    bool "Require birth date verification for file creation"
+    default y
+    help
+      When enabled, every process must register a valid birth date via
+      prctl(PR_SET_BIRTHDATE, day, month, year) before being allowed to
+      create files. Processes that have not registered a birth date or
+      whose registered birth date indicates they are under 18 years of
+      age will receive -ETOOYOUNG on any file creation attempt.
+
+      If unsure, say Y. Failure to comply may result in stern letters
+      from lawyers. You don't want that. Trust us. Say Y.
+
 source "fs/quota/Kconfig"

 source "fs/autofs/Kconfig"
diff --git a/include/uapi/asm-generic/errno.h b/include/uapi/asm-generic/errno.h
index 1..2 100644
--- a/include/uapi/asm-generic/errno.h
+++ b/include/uapi/asm-generic/errno.h
@@ -20,4 +20,6 @@

 #define EHWPOISON    133    /* Memory page has hardware error */

+#define ETOOYOUNG    134    /* Process too young to create content */
+
 #endif
diff --git a/include/uapi/linux/prctl.h b/include/uapi/linux/prctl.h
index 3..4 100644
--- a/include/uapi/linux/prctl.h
+++ b/include/uapi/linux/prctl.h
@@ -328,4 +328,8 @@

 #define PR_LOCK_INDIR_BR_LP_STATUS      82

+/* age verification for file creation */
+#define PR_SET_BIRTHDATE        83
+#define PR_GET_BIRTHDATE        84
+
 #endif /* _LINUX_PRCTL_H */
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 5..6 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1215,6 +1215,14 @@ struct task_struct {
 #endif
     struct seccomp            seccomp;
     struct syscall_user_dispatch    syscall_dispatch;
+
+#ifdef CONFIG_VFS_AGE_VERIFICATION
+    /* compliance - birth date for age verification */
+    u8                birthdate_day;
+    u8                birthdate_month;
+    u16                birthdate_year;
+    bool                birthdate_verified;
+#endif

     /* Thread group tracking: */
     u64                parent_exec_id;
diff --git a/kernel/sys.c b/kernel/sys.c
index 7..8 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -2345,6 +2345,48 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
         break;
+
+#ifdef CONFIG_VFS_AGE_VERIFICATION
+    case PR_SET_BIRTHDATE:
+    {
+        u8 day = (u8)arg2;
+        u8 month = (u8)arg3;
+        u16 year = (u16)arg4;
+        struct tm now;
+        int age;
+
+        /* Basic date validation */
+        if (month < 1 || month > 12)
+            return -EINVAL;
+        if (day < 1 || day > 31)
+            return -EINVAL;
+        if (year < 1900)
+            return -EINVAL;
+
+        time64_to_tm(ktime_get_real_seconds(), 0, &now);
+
+        /* The kernel does not support vampires or immortal entities */
+        if ((now.tm_year + 1900) - year > 150)
+            return -EINVAL;
+
+        /* No time travelers either */
+        if (year > (now.tm_year + 1900))
+            return -EINVAL;
+
+        me->birthdate_day = day;
+        me->birthdate_month = month;
+        me->birthdate_year = year;
+        me->birthdate_verified = true;
+
+        age = (now.tm_year + 1900) - year;
+        if (now.tm_mon + 1 < month ||
+            (now.tm_mon + 1 == month && now.tm_mday < day))
+            age--;
+
+        if (age < 18)
+            pr_info_ratelimited("Process %d (comm: %s) registered as minor (age %d). "
+                "File creation will be denied. Please ask a "
+                "parent or guardian for assistance.\n",
+                task_pid_nr(me), me->comm, age);
+        break;
+    }
+    case PR_GET_BIRTHDATE:
+        if (!me->birthdate_verified)
+            return -EINVAL;
+        if (put_user(me->birthdate_day, (u8 __user *)arg2) ||
+            put_user(me->birthdate_month, (u8 __user *)arg3) ||
+            put_user(me->birthdate_year, (u16 __user *)arg4))
+            return -EFAULT;
+        break;
+#endif /* CONFIG_VFS_AGE_VERIFICATION */
+
     default:
         error = -EINVAL;
         break;
diff --git a/fs/namei.c b/fs/namei.c
index 9..10 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -4148,6 +4148,45 @@ static int vfs_mknodat(struct mnt_idmap *idmap, struct dentry *dentry,
                umode_t mode, dev_t dev);

+#ifdef CONFIG_VFS_AGE_VERIFICATION
+/**
+ * check_age_verification - verify the calling process has registered a valid
+ *                          birth date and is old enough to create files.
+ *
+ * Returns 0 if the caller is verified as an adult (>= 18 years old).
+ * Returns -ETOOYOUNG if the caller is a minor or has not registered a
+ * birth date.
+ *
+ * This function exists because the fundamental UNIX
+ * principle of "everything is a file" was insufficiently regulated.
+ */
+static int check_age_verification(void)
+{
+    struct task_struct *tsk = current;
+    struct tm now;
+    int age;
+
+    if (!tsk->birthdate_verified) {
+        pr_warn_ratelimited(
+            "Process %d (comm: %s) attempted to create a file "
+            "without age verification. Set birth date via "
+            "prctl(PR_SET_BIRTHDATE, day, month, year).\n",
+            task_pid_nr(tsk), tsk->comm);
+        return -ETOOYOUNG;
+    }
+
+    time64_to_tm(ktime_get_real_seconds(), 0, &now);
+
+    age = (now.tm_year + 1900) - tsk->birthdate_year;
+    if (now.tm_mon + 1 < tsk->birthdate_month ||
+        (now.tm_mon + 1 == tsk->birthdate_month &&
+         now.tm_mday < tsk->birthdate_day))
+        age--;
+
+    if (age < 18) {
+        pr_warn_ratelimited(
+            "Process %d (comm: %s) is only %d years old. "
+            "Must be 18 or older to create files. "
+            "Ask a parent or guardian for help.\n",
+            task_pid_nr(tsk), tsk->comm, age);
+        return -ETOOYOUNG;
+    }
+
+    return 0;
+}
+#endif /* CONFIG_VFS_AGE_VERIFICATION */
+
 /**
  * vfs_create - create new file
  * @idmap:    idmap of the mount the inode was found from
@@ -4170,6 +4209,12 @@ int vfs_create(struct mnt_idmap *idmap, struct dentry *dentry, umode_t mode,
     if (error)
         return error;

+#ifdef CONFIG_VFS_AGE_VERIFICATION
+    error = check_age_verification();
+    if (error)
+        return error;
+#endif
+
     if (!dir->i_op->create)
         return -EACCES;    /* shouldn't it be ENOSYS? */

--
2.49.0

Entre las partes más interesantes, a mi parecer, son que con este parche, el Kernel de Linux no soportará deliberadamente el uso de vampiros ni entidades inmortales, estableciendo un condicional que si, la fecha es superior a 150 años en el pasado, devuelve error.

/* The kernel does not support vampires or immortal entities */
if ((now.tm_year + 1900) - year > 150)
    return -EINVAL;

Tampoco soportará viajeros en el tiempo, que tengan establecida una fecha de futuro.

/* No time travelers either */
if (year > (now.tm_year + 1900))
    return -EINVAL;

Si has llegado hasta aquí ya habrás notado que ayer fue 1 de abril, fecha en el que muchos países anglosajones celebran un día de inocentadas y bromas. Hasta el mismo Linus Torvalds ha respondido al mail:

Para quien no tenga ningun contexto, esto obedece a la ley AB 1043 (Digital Age Assurance Act) de California, que pretende obligar a los sistemas operativos a verificar la edad de los usuarios con multas absurdas por incumplimiento.

Tanto puede poner en apuros a algunas pequeñas y grandes distribuciones, que algunas como MidnightBSD ha tomado la bizarra decisión de bloquear geográficamente las descargas de su distribución a usuarios de California mientras buscan una “alternativa”, como la creción de un comandos aged y agectl que llame a una variable edad.

Como era de esperar, esto evidentemente no es propio de California y Silicon Valley, es un proyecto de todas las élites de Occidente, desde Estados Unidos, Gran Bretaña y la Unión Europea. Con la excusa lamentable de proteger a los niños en la red... Sí, las élites diciendo defender a los niños...

Evidentemente la propia estructura y esencia, tanto a nivel de sistema operativo como a nivel de distribución y descentralización hace que los entornos GNU/Linux y Unix Like sean una fortaleza, en cierta medida, de este tipo de políticas; al menos en cuanto al Cosmos: pequeñas distros sí podrían verse gravemente afectadas por el asedio legal positivista.

Esto es algo que, evidentemente, me tranquiliza. ¿Cómo evitarían que en mi copia de una distribución de GNU/Linux quite, antes o después de compilarla, los elementos de control de edad? Además, el propio enfoque de la ley es absolutamente desconocedor del mundo industrial informático, reduciéndolo a usuarios domésticos y ordinarios. ¿Qué pasa con los servidores? ¿qué edad debería tener un servidor dedicado? ¿la del administrador? ¿la del jefe de la empresa? ¿y los sistemas embebidos autónomos? No tiene ningún sentido.