static-httpd

Sitio web estático (HTML + CSS) que sostiene el blog del autor
Log | Files | Refs

index.html (15702B)


      1 <!DOCTYPE html>
      2 <html>
      3 <head>
      4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      5 <meta name="viewport" content="width=device-width, initial-scale=1" />
      6 <title>La ley AB 1043 (Digital Age Assurance Act) de California en el kernel de Linux</title>
      7 <link rel="icon" type="image/png" href="/favicon.png" />
      8 <link rel="stylesheet" type="text/css" href="../article.css" />
      9 </head>
     10 <body>
     11 <header>
     12 <p class="title">La ley AB 1043 (Digital Age Assurance Act) de California en el kernel de Linux</p>
     13 <p class="date">2 de abril de 2026 • fjbalon</p>
     14 </header>
     15 <p>En el día de ayer, se ha visto publicado en el Linux Kernel Mail List un <a href="https://lkml.org/lkml/2026/4/1/1284">correo</a> que detalla un parche muy llamativo: <emb>[PATCH] vfs: require verified birth date for file creation</emb>.</p>
     16 <img src="c3dbd229b287af6db1b02cf53a15d27ae7db7b97.png" />
     17 <p>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.</p>
     18 <p>El parche introduce <emb>CONFIG_VFS_AGE_VERIFICATION</emb> que, cuando está habilitado, requiere que todos los procesos registren una fecha de nacimiento válida a través de <emb>prctl(PR_SET_BIRTHDATE)</emb> antes de que se le permita crear archivos. La fecha de nacimiento se almacena en <emb>struct task_struct</emb> y se hereda a través de <emb>fork()</emb>.</p>
     19 <p>La creación del archivo fallará con el nuevo código de error <emb>ETOOYOUNG</emb> si:</p>
     20 <p>a. No se ha registrado fecha de nacimiento.</p>
     21 <p>b. La fecha de nacimiento registrada indica que el usuario es menor de 18 años.</p> 
     22 <p>Se ha añadido el nuevo <emb>errno</emb>, <emb>ETOOYOUNG (134)</emb>. 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».</p>
     23 <p>Aquí está todo el código del <emb>diff</emb> para quien le interese:</p>
     24 <pre><code class="diff"><span class="hunk">@@ -42,6 +42,23 @@ source "fs/crypto/Kconfig"</span>
     25  source "fs/verity/Kconfig"
     26  source "fs/notify/Kconfig"
     27 
     28 <span class="add">+config VFS_AGE_VERIFICATION</span>
     29 <span class="add">+    bool "Require birth date verification for file creation"</span>
     30 <span class="add">+    default y</span>
     31 <span class="add">+    help</span>
     32 <span class="add">+      When enabled, every process must register a valid birth date via</span>
     33 <span class="add">+      prctl(PR_SET_BIRTHDATE, day, month, year) before being allowed to</span>
     34 <span class="add">+      create files. Processes that have not registered a birth date or</span>
     35 <span class="add">+      whose registered birth date indicates they are under 18 years of</span>
     36 <span class="add">+      age will receive -ETOOYOUNG on any file creation attempt.</span>
     37 <span class="add">+</span>
     38 <span class="add">+      If unsure, say Y. Failure to comply may result in stern letters</span>
     39 <span class="add">+      from lawyers. You don't want that. Trust us. Say Y.</span>
     40 <span class="add">+</span>
     41  source "fs/quota/Kconfig"
     42 
     43  source "fs/autofs/Kconfig"
     44 <span class="info">diff --git a/include/uapi/asm-generic/errno.h b/include/uapi/asm-generic/errno.h</span>
     45 <span class="info">index 1..2 100644</span>
     46 <span class="info">--- a/include/uapi/asm-generic/errno.h</span>
     47 <span class="info">+++ b/include/uapi/asm-generic/errno.h</span>
     48 <span class="hunk">@@ -20,4 +20,6 @@</span>
     49 
     50  #define EHWPOISON    133    /* Memory page has hardware error */
     51 
     52 <span class="add">+#define ETOOYOUNG    134    /* Process too young to create content */</span>
     53 <span class="add">+</span>
     54  #endif
     55 <span class="info">diff --git a/include/uapi/linux/prctl.h b/include/uapi/linux/prctl.h</span>
     56 <span class="info">index 3..4 100644</span>
     57 <span class="info">--- a/include/uapi/linux/prctl.h</span>
     58 <span class="info">+++ b/include/uapi/linux/prctl.h</span>
     59 <span class="hunk">@@ -328,4 +328,8 @@</span>
     60 
     61  #define PR_LOCK_INDIR_BR_LP_STATUS      82
     62 
     63 <span class="add">+/* age verification for file creation */</span>
     64 <span class="add">+#define PR_SET_BIRTHDATE        83</span>
     65 <span class="add">+#define PR_GET_BIRTHDATE        84</span>
     66 <span class="add">+</span>
     67  #endif /* _LINUX_PRCTL_H */
     68 <span class="info">diff --git a/include/linux/sched.h b/include/linux/sched.h</span>
     69 <span class="info">index 5..6 100644</span>
     70 <span class="info">--- a/include/linux/sched.h</span>
     71 <span class="info">+++ b/include/linux/sched.h</span>
     72 <span class="hunk">@@ -1215,6 +1215,14 @@ struct task_struct {</span>
     73  #endif
     74      struct seccomp            seccomp;
     75      struct syscall_user_dispatch    syscall_dispatch;
     76 <span class="add">+</span>
     77 <span class="add">+#ifdef CONFIG_VFS_AGE_VERIFICATION</span>
     78 <span class="add">+    /* compliance - birth date for age verification */</span>
     79 <span class="add">+    u8                birthdate_day;</span>
     80 <span class="add">+    u8                birthdate_month;</span>
     81 <span class="add">+    u16                birthdate_year;</span>
     82 <span class="add">+    bool                birthdate_verified;</span>
     83 <span class="add">+#endif</span>
     84 
     85      /* Thread group tracking: */
     86      u64                parent_exec_id;
     87 <span class="info">diff --git a/kernel/sys.c b/kernel/sys.c</span>
     88 <span class="info">index 7..8 100644</span>
     89 <span class="info">--- a/kernel/sys.c</span>
     90 <span class="info">+++ b/kernel/sys.c</span>
     91 <span class="hunk">@@ -2345,6 +2345,48 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,</span>
     92          break;
     93 <span class="add">+</span>
     94 <span class="add">+#ifdef CONFIG_VFS_AGE_VERIFICATION</span>
     95 <span class="add">+    case PR_SET_BIRTHDATE:</span>
     96 <span class="add">+    {</span>
     97 <span class="add">+        u8 day = (u8)arg2;</span>
     98 <span class="add">+        u8 month = (u8)arg3;</span>
     99 <span class="add">+        u16 year = (u16)arg4;</span>
    100 <span class="add">+        struct tm now;</span>
    101 <span class="add">+        int age;</span>
    102 <span class="add">+</span>
    103 <span class="add">+        /* Basic date validation */</span>
    104 <span class="add">+        if (month &lt; 1 || month &gt; 12)</span>
    105 <span class="add">+            return -EINVAL;</span>
    106 <span class="add">+        if (day &lt; 1 || day &gt; 31)</span>
    107 <span class="add">+            return -EINVAL;</span>
    108 <span class="add">+        if (year &lt; 1900)</span>
    109 <span class="add">+            return -EINVAL;</span>
    110 <span class="add">+</span>
    111 <span class="add">+        time64_to_tm(ktime_get_real_seconds(), 0, &amp;now);</span>
    112 <span class="add">+</span>
    113 <span class="add">+        /* The kernel does not support vampires or immortal entities */</span>
    114 <span class="add">+        if ((now.tm_year + 1900) - year &gt; 150)</span>
    115 <span class="add">+            return -EINVAL;</span>
    116 <span class="add">+</span>
    117 <span class="add">+        /* No time travelers either */</span>
    118 <span class="add">+        if (year &gt; (now.tm_year + 1900))</span>
    119 <span class="add">+            return -EINVAL;</span>
    120 <span class="add">+</span>
    121 <span class="add">+        me-&gt;birthdate_day = day;</span>
    122 <span class="add">+        me-&gt;birthdate_month = month;</span>
    123 <span class="add">+        me-&gt;birthdate_year = year;</span>
    124 <span class="add">+        me-&gt;birthdate_verified = true;</span>
    125 <span class="add">+</span>
    126 <span class="add">+        age = (now.tm_year + 1900) - year;</span>
    127 <span class="add">+        if (now.tm_mon + 1 &lt; month ||</span>
    128 <span class="add">+            (now.tm_mon + 1 == month &amp;&amp; now.tm_mday &lt; day))</span>
    129 <span class="add">+            age--;</span>
    130 <span class="add">+</span>
    131 <span class="add">+        if (age &lt; 18)</span>
    132 <span class="add">+            pr_info_ratelimited("Process %d (comm: %s) registered as minor (age %d). "</span>
    133 <span class="add">+                "File creation will be denied. Please ask a "</span>
    134 <span class="add">+                "parent or guardian for assistance.\n",</span>
    135 <span class="add">+                task_pid_nr(me), me-&gt;comm, age);</span>
    136 <span class="add">+        break;</span>
    137 <span class="add">+    }</span>
    138 <span class="add">+    case PR_GET_BIRTHDATE:</span>
    139 <span class="add">+        if (!me-&gt;birthdate_verified)</span>
    140 <span class="add">+            return -EINVAL;</span>
    141 <span class="add">+        if (put_user(me-&gt;birthdate_day, (u8 __user *)arg2) ||</span>
    142 <span class="add">+            put_user(me-&gt;birthdate_month, (u8 __user *)arg3) ||</span>
    143 <span class="add">+            put_user(me-&gt;birthdate_year, (u16 __user *)arg4))</span>
    144 <span class="add">+            return -EFAULT;</span>
    145 <span class="add">+        break;</span>
    146 <span class="add">+#endif /* CONFIG_VFS_AGE_VERIFICATION */</span>
    147 <span class="add">+</span>
    148      default:
    149          error = -EINVAL;
    150          break;
    151 <span class="info">diff --git a/fs/namei.c b/fs/namei.c</span>
    152 <span class="info">index 9..10 100644</span>
    153 <span class="info">--- a/fs/namei.c</span>
    154 <span class="info">+++ b/fs/namei.c</span>
    155 <span class="hunk">@@ -4148,6 +4148,45 @@ static int vfs_mknodat(struct mnt_idmap *idmap, struct dentry *dentry,</span>
    156                 umode_t mode, dev_t dev);
    157 
    158 <span class="add">+#ifdef CONFIG_VFS_AGE_VERIFICATION</span>
    159 <span class="add">+/**</span>
    160 <span class="add">+ * check_age_verification - verify the calling process has registered a valid</span>
    161 <span class="add">+ *                          birth date and is old enough to create files.</span>
    162 <span class="add">+ *</span>
    163 <span class="add">+ * Returns 0 if the caller is verified as an adult (&gt;= 18 years old).</span>
    164 <span class="add">+ * Returns -ETOOYOUNG if the caller is a minor or has not registered a</span>
    165 <span class="add">+ * birth date.</span>
    166 <span class="add">+ *</span>
    167 <span class="add">+ * This function exists because the fundamental UNIX</span>
    168 <span class="add">+ * principle of "everything is a file" was insufficiently regulated.</span>
    169 <span class="add">+ */</span>
    170 <span class="add">+static int check_age_verification(void)</span>
    171 <span class="add">+{</span>
    172 <span class="add">+    struct task_struct *tsk = current;</span>
    173 <span class="add">+    struct tm now;</span>
    174 <span class="add">+    int age;</span>
    175 <span class="add">+</span>
    176 <span class="add">+    if (!tsk-&gt;birthdate_verified) {</span>
    177 <span class="add">+        pr_warn_ratelimited(</span>
    178 <span class="add">+            "Process %d (comm: %s) attempted to create a file "</span>
    179 <span class="add">+            "without age verification. Set birth date via "</span>
    180 <span class="add">+            "prctl(PR_SET_BIRTHDATE, day, month, year).\n",</span>
    181 <span class="add">+            task_pid_nr(tsk), tsk-&gt;comm);</span>
    182 <span class="add">+        return -ETOOYOUNG;</span>
    183 <span class="add">+    }</span>
    184 <span class="add">+</span>
    185 <span class="add">+    time64_to_tm(ktime_get_real_seconds(), 0, &amp;now);</span>
    186 <span class="add">+</span>
    187 <span class="add">+    age = (now.tm_year + 1900) - tsk-&gt;birthdate_year;</span>
    188 <span class="add">+    if (now.tm_mon + 1 &lt; tsk-&gt;birthdate_month ||</span>
    189 <span class="add">+        (now.tm_mon + 1 == tsk-&gt;birthdate_month &amp;&amp;</span>
    190 <span class="add">+         now.tm_mday &lt; tsk-&gt;birthdate_day))</span>
    191 <span class="add">+        age--;</span>
    192 <span class="add">+</span>
    193 <span class="add">+    if (age &lt; 18) {</span>
    194 <span class="add">+        pr_warn_ratelimited(</span>
    195 <span class="add">+            "Process %d (comm: %s) is only %d years old. "</span>
    196 <span class="add">+            "Must be 18 or older to create files. "</span>
    197 <span class="add">+            "Ask a parent or guardian for help.\n",</span>
    198 <span class="add">+            task_pid_nr(tsk), tsk-&gt;comm, age);</span>
    199 <span class="add">+        return -ETOOYOUNG;</span>
    200 <span class="add">+    }</span>
    201 <span class="add">+</span>
    202 <span class="add">+    return 0;</span>
    203 <span class="add">+}</span>
    204 <span class="add">+#endif /* CONFIG_VFS_AGE_VERIFICATION */</span>
    205 <span class="add">+</span>
    206  /**
    207   * vfs_create - create new file
    208   * @idmap:    idmap of the mount the inode was found from
    209 <span class="hunk">@@ -4170,6 +4209,12 @@ int vfs_create(struct mnt_idmap *idmap, struct dentry *dentry, umode_t mode,</span>
    210      if (error)
    211          return error;
    212 
    213 <span class="add">+#ifdef CONFIG_VFS_AGE_VERIFICATION</span>
    214 <span class="add">+    error = check_age_verification();</span>
    215 <span class="add">+    if (error)</span>
    216 <span class="add">+        return error;</span>
    217 <span class="add">+#endif</span>
    218 <span class="add">+</span>
    219      if (!dir-&gt;i_op-&gt;create)
    220          return -EACCES;    /* shouldn't it be ENOSYS? */
    221 
    222 <span class="del">--</span>
    223 2.49.0</code></pre>
    224 <p>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.</p>
    225 <pre><code>/* The kernel does not support vampires or immortal entities */
    226 if ((now.tm_year + 1900) - year > 150)
    227     return -EINVAL;</code></pre>
    228 <p>Tampoco soportará viajeros en el tiempo, que tengan establecida una fecha de futuro.</p>
    229 <pre><code>/* No time travelers either */
    230 if (year > (now.tm_year + 1900))
    231     return -EINVAL;</code></pre>
    232 <p>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 <a href="https://lkml.org/lkml/2026/4/1/1730">respondido</a> al mail:</p>
    233 <img src="7bbf8de17e7fb8a62cf10dfc13bbfb95781d2491.png" />
    234 <p>Para quien no tenga ningun contexto, esto obedece a la <i>ley AB 1043 (Digital Age Assurance Act)</i> de California, que pretende obligar a los sistemas operativos a verificar la edad de los usuarios con multas absurdas por incumplimiento.</p>
    235 <p>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 <emb>aged</emb> y <emb>agectl</emb> que llame a una variable edad.</p>
    236 <p>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...</p>
    237 <p>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.</p>
    238 <p>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.</p>
    239 </body>
    240 </html>