** Description changed:

  [Impact]
  
   * The Focal FIPS kernel in fips-updates hits kernel BUG/Oops
     errors during boot with the FIPS OpenSSL library installed
     (but those don't cause issues), when it runs modprobe with
     request_module() when looking up crypto algorithms/modules.
  
   * The modprobe command happens to call the OpenSSL library,
     and the FIPS version of OpenSSL calls getrandom(),
     and the FIPS kernel calls the DRBG for that,
     BUT it's _not yet_ initialized that early during boot
     when the kernel can run modprobe via request_module().
     (e.g., IPv6 initialization time.)
  
   * The issue impacts the kernels in fips-updates only, per:
     "UBUNTU: SAUCE: random: Use Crypto API DRBG for urandom in FIPS mode"
     which exists in Focal, but not in Xenial/Bionic/Jammy.
  
+  * The issue only happens with the crypto algorithms, even
+    if they're built-in (i.e., modprobe is not needed).
+ 
+ 
  [Fix]
  
-  * The issue only happens with the crypto algorithms, even
-    if they're built-in (i.e., modprobe is not needed), so
-    the fix approach is to set CRYPTO_NOLOAD while the DRBG
-    isn't yet initialized; this skips request_module() calls.
+  * Fall back to CRNG while the DRBG is not yet initialized.
+    (Marcelo Cerri confirmed it's OK per other discussions.)
  
   * The fix doesn't change the list and details of algorithms
     as in /proc/crypto (e.g., name, driver, module,  priority)
     by the time the DRBG is initialized / initramfs started,
     so even though behavior changes, the net effect doesn't.
  
   * (Note: it's not possible to just use an initcall level
      earlier than rootfs_initcall() so modprobe isn't there,
      because fips_drbg_init() must run _after_ module_init()
      level so that crypto_rng_reset() works, even though its
-     required module is built-in too.
+     required module is built-in too.
  
  [Test Steps]
  
   * Install the kernel and openssl from fips-updates,
     boot with fips=1, check dmesg for BUG/Oops errors:
  
     $ sudo apt install linux-image-fips libssl1.1 # fips-updates
     $ sudo vim /etc/default/grub # append fips=1 boot option
     $ sudo update-grub && sudo reboot
     $ sudo dmesg | grep BUG:
  
   * Check/store the /proc/crypto file for comparisons.
     You can boot with break=top as well, to check that
     as early as possible, and copy into /run/initramfs/
     then exit, to get it later in the rootfs.
  
  [Regression Potential]
  
-  * The fix skips calls to request_module()/modprobe on
-    early boot until the FIPS DRBG is initialized (only
-    in the crypto subsystem) thus potential regressions
-    would show up as early boot kernel errors messages
-    or crypto algorithms not up after system booted.
-    (These should have no impact, theoretically, as it
-     currently doesn't run anyway, because of BUG/Oops.)
- 
-  * The fix also adds a panic() call in request_module()
-    if other/non-crypto kernel code attempts to load a
-    module while the DRBG isn't ready yet (so we catch
-    that earlier). It's possible to use a boot option
-    to disable that behavior, but it disables FIPS mode
-    for strictness.
+  * The fix falls back to the regular CRNG for a while
+    in early boot. The CRNG is used permanently in the
+    non-FIPS kernels (and in FIPS kernels w/out fips=1),
+    so the code path is exercised/tested frequently.
+    
+  * Regressions would most likely occur in calls to
+    getrandom() before the DRBG is initialized, but
+    that currently hits a BUG/Oops anyway.
  
  [Original Bug Description]
  
  $ sudo apt install --yes linux-image-fips # fips-updates
  $ sudo vim /etc/default/grub # fips=1
  $ sudo update-grub && sudo reboot
  
  $ uname -r
  5.4.0-1056-fips
  
  $ cat /proc/cmdline
  ... fips=1
  
  No errors with the original/non-FIPS openssl, because it does NOT call
  getrandom():
  
  $ dmesg | grep -c BUG:
  0
  
  $ dpkg -s libssl1.1 | grep ^Version:
  Version: 1.1.1f-1ubuntu2.15
  
  $ strace -e getrandom modprobe --version
  kmod version 27
  +ZSTD +XZ -ZLIB +LIBCRYPTO -EXPERIMENTAL
  +++ exited with 0 +++
  
  But if you install the FIPS openssl, it calls getrandom(), then BUG/Oops
  happen:
  
  $ sudo apt install libssl1.1 # updates initramfs
  
  $ dpkg -s libssl1.1 | grep ^Version:
  Version: 1.1.1f-1ubuntu2.fips.13.1
  
  $ strace -e getrandom modprobe --version
  getrandom("\xc4\x84\x26\x25\x6f\xd4\xed\x38\xdf\xa9\x67\xee\x15\x1c\xe3\x98", 
16, GRND_NONBLOCK) = 16
  getrandom("\xa1\xd6\x67\x3e\xe4\x90\xb3\x8b\xdf\xe6\x34\x2a\xa7\x50\xbc\x2f", 
16, GRND_NONBLOCK) = 16
  getrandom("\xf1\x3e\xe4\x27\x9d\x47\x8c\x4b\x8a\x39\x8c\xe1\x2e\xee\xfa\x45", 
16, GRND_NONBLOCK) = 16
  getrandom("\xfb\x34\x18\x44\xd8\x23\x4c\x87\x13\x2e\x6b\x03\x79\xa7\x99\xf8", 
16, 0) = 16
  getrandom("\xdd\x83\xa7\x02\x10\x51\x2b\x4f\x21\x6b\xc1\xf1\x0d\xe7\x44\xb7", 
16, 0) = 16
  kmod version 27
  +ZSTD +XZ -ZLIB +LIBCRYPTO -EXPERIMENTAL
  +++ exited with 0 +++
  
  $ sudo reboot
  
  $ dmesg | grep -c BUG:
  22
  
  $ dmesg
  ...
  [    1.595759] NET: Registered protocol family 10
  [    1.600256] BUG: kernel NULL pointer dereference, address: 0000000000000038
  ...
  [    1.603829] CPU: 2 PID: 137 Comm: modprobe Not tainted 5.4.0-1056-fips 
#64-Ubuntu
  [    1.603829] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 
1.13.0-1ubuntu1.1 04/01/2014
  [    1.603829] RIP: 0010:urandom_read+0x268/0x480
  ...
  [    1.603829] Call Trace:
  [    1.603829]  __x64_sys_getrandom+0x7f/0x130
  [    1.603829]  do_syscall_64+0x57/0x190
  [    1.603829]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
  ...
  
  All BUG/Oops errors are the same:
  
  $ dmesg | grep BUG: | sed 's/^.*BUG:/BUG:/' | uniq -c
       22 BUG: kernel NULL pointer dereference, address: 0000000000000038
  
  And they stop after the DRBG is initialized:
  
  [    3.651566] random: DRBG (drbg_nopr_ctr_aes256) initialized!
  
  [Fix Impact Analysis]
  
- The patches add 3 module options to configure the behavior
- of the components involved in the issue/fix.  They can be
- seen with dynamic debug in the kernel cmdline:
+ The patch adds a dynamic debug message that can be enabled
+ in the kernel cmdline, for comparisons (dmesg); we can also
+ compare /proc/crypto for no changes.
  
- dyndbg="func crypto_alg_mod_lookup +p; func crypto_lookup_template +p;
- func __request_module +p"
+ dyndbg="func urandom_read +p"
  
  Also add break=top, so we can copy /proc/crypto and dmesg
  right after DRBG is initialized (when initramfs is started).
  
- Let's compare the 4 possible combination (first is 'no functional
- change'):
- 
- random.fips_urandom_drbg_enable=0
- random.fips_urandom_drbg_crypto_noload=0
- random.fips_urandom_drbg_modprobe_panic=0
- 
- random.fips_urandom_drbg_enable=1
- random.fips_urandom_drbg_crypto_noload=0
- random.fips_urandom_drbg_modprobe_panic=0
- 
- random.fips_urandom_drbg_enable=1
- random.fips_urandom_drbg_crypto_noload=1
- random.fips_urandom_drbg_modprobe_panic=0
- 
- random.fips_urandom_drbg_enable=1
- random.fips_urandom_drbg_crypto_noload=1
- random.fips_urandom_drbg_modprobe_panic=1
- 
  @ break=top time
  
-  enable=$(cat /sys/module/random/parameters/fips_urandom_drbg_enable)
-  noload=$(cat /sys/module/random/parameters/fips_urandom_drbg_crypto_noload)
-  panic=$(cat /sys/module/random/parameters/fips_urandom_drbg_modprobe_panic)
-  suffix="enable${enable}_noload${noload}_panic${panic}"
- 
+  suffix=original # or modified
   cat /proc/crypto > /run/initramfs/proc-crypto.$suffix
   dmesg > /run/initramfs/dmesg.$suffix
- 
   exit
  
  @ login time
   sudo -s
   cp /run/initramfs/{proc-crypto.*,dmesg.*} .
-  reboot # next possible combination
+  reboot # next test
  
  There's no difference in the list/details of loaded crypto algorithms at
  all, with any combination:
  
- # md5sum proc-crypto.enable*_noload*_panic*
- 0b91bd619078fa342c6b4da039cb1582  proc-crypto.enableN_noloadN_panicN
- 0b91bd619078fa342c6b4da039cb1582  proc-crypto.enableY_noloadN_panicN
- 0b91bd619078fa342c6b4da039cb1582  proc-crypto.enableY_noloadY_panicN
- 0b91bd619078fa342c6b4da039cb1582  proc-crypto.enableY_noloadY_panicY
+ # md5sum proc-crypto.*
+ 0b91bd619078fa342c6b4da039cb1582  proc-crypto.modified
+ 0b91bd619078fa342c6b4da039cb1582  proc-crypto.original
  
- The only option that hits BUG/Oops errors is when you disable the fix
- (ie, don't set CRYPTO_NOLOAD):
+ The kernel with the fix does not hit BUG/Oops errors:
  
- # grep -c BUG: dmesg.enable*_noload*_panic*
- dmesg.enableN_noloadN_panicN:0
- dmesg.enableY_noloadN_panicN:22
- dmesg.enableY_noloadY_panicN:0
- dmesg.enableY_noloadY_panicY:0
+ # grep ^ -m1 dmesg.*
+ dmesg.modified:[    0.000000] Linux version 5.4.0-1060-fips ... 
#68+fipsdrbgnullcheck ... (Ubuntu 5.4.0-1060.68+fipsdrbgnullcheck-fips 5.4.195)
+ dmesg.original:[    0.000000] Linux version 5.4.0-1060-fips ... #68-Ubuntu 
... (Ubuntu 5.4.0-1060.68-fips 5.4.195)
+ 
+ # grep -c BUG: dmesg.*
+ dmesg.modified:0
+ dmesg.original:22
+ 
+ # grep -c 'random: DRBG uninitialized! crng fallback' dmesg.*
+ dmesg.modified:110
+ dmesg.original:0
+ 
+ The 110 number is 5 * 22 calls as modprobe calls getrandom() 5 times (see 
strace above).
+ The original kernel has 1 BUG/Oops only because that kills the modprobe task.

** Description changed:

  [Impact]
  
   * The Focal FIPS kernel in fips-updates hits kernel BUG/Oops
     errors during boot with the FIPS OpenSSL library installed
     (but those don't cause issues), when it runs modprobe with
     request_module() when looking up crypto algorithms/modules.
  
   * The modprobe command happens to call the OpenSSL library,
     and the FIPS version of OpenSSL calls getrandom(),
     and the FIPS kernel calls the DRBG for that,
     BUT it's _not yet_ initialized that early during boot
     when the kernel can run modprobe via request_module().
     (e.g., IPv6 initialization time.)
  
   * The issue impacts the kernels in fips-updates only, per:
     "UBUNTU: SAUCE: random: Use Crypto API DRBG for urandom in FIPS mode"
     which exists in Focal, but not in Xenial/Bionic/Jammy.
  
   * The issue only happens with the crypto algorithms, even
     if they're built-in (i.e., modprobe is not needed).
  
- 
  [Fix]
  
   * Fall back to CRNG while the DRBG is not yet initialized.
-    (Marcelo Cerri confirmed it's OK per other discussions.)
+    (Marcelo Cerri confirmed it's OK per other discussions.)
  
   * The fix doesn't change the list and details of algorithms
     as in /proc/crypto (e.g., name, driver, module,  priority)
     by the time the DRBG is initialized / initramfs started,
     so even though behavior changes, the net effect doesn't.
  
   * (Note: it's not possible to just use an initcall level
      earlier than rootfs_initcall() so modprobe isn't there,
      because fips_drbg_init() must run _after_ module_init()
      level so that crypto_rng_reset() works, even though its
      required module is built-in too.
  
  [Test Steps]
  
   * Install the kernel and openssl from fips-updates,
     boot with fips=1, check dmesg for BUG/Oops errors:
  
     $ sudo apt install linux-image-fips libssl1.1 # fips-updates
     $ sudo vim /etc/default/grub # append fips=1 boot option
     $ sudo update-grub && sudo reboot
     $ sudo dmesg | grep BUG:
  
   * Check/store the /proc/crypto file for comparisons.
     You can boot with break=top as well, to check that
     as early as possible, and copy into /run/initramfs/
     then exit, to get it later in the rootfs.
  
  [Regression Potential]
  
   * The fix falls back to the regular CRNG for a while
-    in early boot. The CRNG is used permanently in the
-    non-FIPS kernels (and in FIPS kernels w/out fips=1),
-    so the code path is exercised/tested frequently.
-    
+    in early boot. The CRNG is used permanently in the
+    non-FIPS kernels (and in FIPS kernels w/out fips=1),
+    so the code path is exercised/tested frequently.
+ 
   * Regressions would most likely occur in calls to
-    getrandom() before the DRBG is initialized, but
-    that currently hits a BUG/Oops anyway.
+    getrandom() before the DRBG is initialized, but
+    that currently hits a BUG/Oops anyway.
  
  [Original Bug Description]
  
  $ sudo apt install --yes linux-image-fips # fips-updates
  $ sudo vim /etc/default/grub # fips=1
  $ sudo update-grub && sudo reboot
  
  $ uname -r
  5.4.0-1056-fips
  
  $ cat /proc/cmdline
  ... fips=1
  
  No errors with the original/non-FIPS openssl, because it does NOT call
  getrandom():
  
  $ dmesg | grep -c BUG:
  0
  
  $ dpkg -s libssl1.1 | grep ^Version:
  Version: 1.1.1f-1ubuntu2.15
  
  $ strace -e getrandom modprobe --version
  kmod version 27
  +ZSTD +XZ -ZLIB +LIBCRYPTO -EXPERIMENTAL
  +++ exited with 0 +++
  
  But if you install the FIPS openssl, it calls getrandom(), then BUG/Oops
  happen:
  
  $ sudo apt install libssl1.1 # updates initramfs
  
  $ dpkg -s libssl1.1 | grep ^Version:
  Version: 1.1.1f-1ubuntu2.fips.13.1
  
  $ strace -e getrandom modprobe --version
  getrandom("\xc4\x84\x26\x25\x6f\xd4\xed\x38\xdf\xa9\x67\xee\x15\x1c\xe3\x98", 
16, GRND_NONBLOCK) = 16
  getrandom("\xa1\xd6\x67\x3e\xe4\x90\xb3\x8b\xdf\xe6\x34\x2a\xa7\x50\xbc\x2f", 
16, GRND_NONBLOCK) = 16
  getrandom("\xf1\x3e\xe4\x27\x9d\x47\x8c\x4b\x8a\x39\x8c\xe1\x2e\xee\xfa\x45", 
16, GRND_NONBLOCK) = 16
  getrandom("\xfb\x34\x18\x44\xd8\x23\x4c\x87\x13\x2e\x6b\x03\x79\xa7\x99\xf8", 
16, 0) = 16
  getrandom("\xdd\x83\xa7\x02\x10\x51\x2b\x4f\x21\x6b\xc1\xf1\x0d\xe7\x44\xb7", 
16, 0) = 16
  kmod version 27
  +ZSTD +XZ -ZLIB +LIBCRYPTO -EXPERIMENTAL
  +++ exited with 0 +++
  
  $ sudo reboot
  
  $ dmesg | grep -c BUG:
  22
  
  $ dmesg
  ...
  [    1.595759] NET: Registered protocol family 10
  [    1.600256] BUG: kernel NULL pointer dereference, address: 0000000000000038
  ...
  [    1.603829] CPU: 2 PID: 137 Comm: modprobe Not tainted 5.4.0-1056-fips 
#64-Ubuntu
  [    1.603829] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 
1.13.0-1ubuntu1.1 04/01/2014
  [    1.603829] RIP: 0010:urandom_read+0x268/0x480
  ...
  [    1.603829] Call Trace:
  [    1.603829]  __x64_sys_getrandom+0x7f/0x130
  [    1.603829]  do_syscall_64+0x57/0x190
  [    1.603829]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
  ...
  
  All BUG/Oops errors are the same:
  
  $ dmesg | grep BUG: | sed 's/^.*BUG:/BUG:/' | uniq -c
       22 BUG: kernel NULL pointer dereference, address: 0000000000000038
  
  And they stop after the DRBG is initialized:
  
  [    3.651566] random: DRBG (drbg_nopr_ctr_aes256) initialized!
  
  [Fix Impact Analysis]
  
  The patch adds a dynamic debug message that can be enabled
  in the kernel cmdline, for comparisons (dmesg); we can also
  compare /proc/crypto for no changes.
  
  dyndbg="func urandom_read +p"
  
  Also add break=top, so we can copy /proc/crypto and dmesg
  right after DRBG is initialized (when initramfs is started).
  
  @ break=top time
  
-  suffix=original # or modified
+  suffix=original # or modified
   cat /proc/crypto > /run/initramfs/proc-crypto.$suffix
   dmesg > /run/initramfs/dmesg.$suffix
   exit
  
  @ login time
   sudo -s
   cp /run/initramfs/{proc-crypto.*,dmesg.*} .
   reboot # next test
  
  There's no difference in the list/details of loaded crypto algorithms at
  all, with any combination:
  
  # md5sum proc-crypto.*
  0b91bd619078fa342c6b4da039cb1582  proc-crypto.modified
  0b91bd619078fa342c6b4da039cb1582  proc-crypto.original
  
  The kernel with the fix does not hit BUG/Oops errors:
  
  # grep ^ -m1 dmesg.*
- dmesg.modified:[    0.000000] Linux version 5.4.0-1060-fips ... 
#68+fipsdrbgnullcheck ... (Ubuntu 5.4.0-1060.68+fipsdrbgnullcheck-fips 5.4.195)
- dmesg.original:[    0.000000] Linux version 5.4.0-1060-fips ... #68-Ubuntu 
... (Ubuntu 5.4.0-1060.68-fips 5.4.195)
+ dmesg.modified:[    0.000000] Linux version 5.4.0-1060-fips ... 
#68+fipsdrbgnullcheck ... 
+ dmesg.original:[    0.000000] Linux version 5.4.0-1060-fips ... #68-Ubuntu ...
  
  # grep -c BUG: dmesg.*
  dmesg.modified:0
  dmesg.original:22
  
  # grep -c 'random: DRBG uninitialized! crng fallback' dmesg.*
  dmesg.modified:110
  dmesg.original:0
  
  The 110 number is 5 * 22 calls as modprobe calls getrandom() 5 times (see 
strace above).
  The original kernel has 1 BUG/Oops only because that kills the modprobe task.

-- 
You received this bug notification because you are a member of Kernel
Packages, which is subscribed to linux in Ubuntu.
https://bugs.launchpad.net/bugs/1981487

Title:
  kernel BUG/Oops errors from modprobe while the DRBG has not yet
  initialized (focal/fips-updates)

Status in linux package in Ubuntu:
  Invalid
Status in linux source package in Bionic:
  Invalid
Status in linux source package in Focal:
  In Progress
Status in linux source package in Jammy:
  Invalid

Bug description:
  [Impact]

   * The Focal FIPS kernel in fips-updates hits kernel BUG/Oops
     errors during boot with the FIPS OpenSSL library installed
     (but those don't cause issues), when it runs modprobe with
     request_module() when looking up crypto algorithms/modules.

   * The modprobe command happens to call the OpenSSL library,
     and the FIPS version of OpenSSL calls getrandom(),
     and the FIPS kernel calls the DRBG for that,
     BUT it's _not yet_ initialized that early during boot
     when the kernel can run modprobe via request_module().
     (e.g., IPv6 initialization time.)

   * The issue impacts the kernels in fips-updates only, per:
     "UBUNTU: SAUCE: random: Use Crypto API DRBG for urandom in FIPS mode"
     which exists in Focal, but not in Xenial/Bionic/Jammy.

   * The issue only happens with the crypto algorithms, even
     if they're built-in (i.e., modprobe is not needed).

  [Fix]

   * Fall back to CRNG while the DRBG is not yet initialized.
     (Marcelo Cerri confirmed it's OK per other discussions.)

   * The fix doesn't change the list and details of algorithms
     as in /proc/crypto (e.g., name, driver, module,  priority)
     by the time the DRBG is initialized / initramfs started,
     so even though behavior changes, the net effect doesn't.

   * (Note: it's not possible to just use an initcall level
      earlier than rootfs_initcall() so modprobe isn't there,
      because fips_drbg_init() must run _after_ module_init()
      level so that crypto_rng_reset() works, even though its
      required module is built-in too.

  [Test Steps]

   * Install the kernel and openssl from fips-updates,
     boot with fips=1, check dmesg for BUG/Oops errors:

     $ sudo apt install linux-image-fips libssl1.1 # fips-updates
     $ sudo vim /etc/default/grub # append fips=1 boot option
     $ sudo update-grub && sudo reboot
     $ sudo dmesg | grep BUG:

   * Check/store the /proc/crypto file for comparisons.
     You can boot with break=top as well, to check that
     as early as possible, and copy into /run/initramfs/
     then exit, to get it later in the rootfs.

  [Regression Potential]

   * The fix falls back to the regular CRNG for a while
     in early boot. The CRNG is used permanently in the
     non-FIPS kernels (and in FIPS kernels w/out fips=1),
     so the code path is exercised/tested frequently.

   * Regressions would most likely occur in calls to
     getrandom() before the DRBG is initialized, but
     that currently hits a BUG/Oops anyway.

  [Original Bug Description]

  $ sudo apt install --yes linux-image-fips # fips-updates
  $ sudo vim /etc/default/grub # fips=1
  $ sudo update-grub && sudo reboot

  $ uname -r
  5.4.0-1056-fips

  $ cat /proc/cmdline
  ... fips=1

  No errors with the original/non-FIPS openssl, because it does NOT call
  getrandom():

  $ dmesg | grep -c BUG:
  0

  $ dpkg -s libssl1.1 | grep ^Version:
  Version: 1.1.1f-1ubuntu2.15

  $ strace -e getrandom modprobe --version
  kmod version 27
  +ZSTD +XZ -ZLIB +LIBCRYPTO -EXPERIMENTAL
  +++ exited with 0 +++

  But if you install the FIPS openssl, it calls getrandom(), then
  BUG/Oops happen:

  $ sudo apt install libssl1.1 # updates initramfs

  $ dpkg -s libssl1.1 | grep ^Version:
  Version: 1.1.1f-1ubuntu2.fips.13.1

  $ strace -e getrandom modprobe --version
  getrandom("\xc4\x84\x26\x25\x6f\xd4\xed\x38\xdf\xa9\x67\xee\x15\x1c\xe3\x98", 
16, GRND_NONBLOCK) = 16
  getrandom("\xa1\xd6\x67\x3e\xe4\x90\xb3\x8b\xdf\xe6\x34\x2a\xa7\x50\xbc\x2f", 
16, GRND_NONBLOCK) = 16
  getrandom("\xf1\x3e\xe4\x27\x9d\x47\x8c\x4b\x8a\x39\x8c\xe1\x2e\xee\xfa\x45", 
16, GRND_NONBLOCK) = 16
  getrandom("\xfb\x34\x18\x44\xd8\x23\x4c\x87\x13\x2e\x6b\x03\x79\xa7\x99\xf8", 
16, 0) = 16
  getrandom("\xdd\x83\xa7\x02\x10\x51\x2b\x4f\x21\x6b\xc1\xf1\x0d\xe7\x44\xb7", 
16, 0) = 16
  kmod version 27
  +ZSTD +XZ -ZLIB +LIBCRYPTO -EXPERIMENTAL
  +++ exited with 0 +++

  $ sudo reboot

  $ dmesg | grep -c BUG:
  22

  $ dmesg
  ...
  [    1.595759] NET: Registered protocol family 10
  [    1.600256] BUG: kernel NULL pointer dereference, address: 0000000000000038
  ...
  [    1.603829] CPU: 2 PID: 137 Comm: modprobe Not tainted 5.4.0-1056-fips 
#64-Ubuntu
  [    1.603829] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 
1.13.0-1ubuntu1.1 04/01/2014
  [    1.603829] RIP: 0010:urandom_read+0x268/0x480
  ...
  [    1.603829] Call Trace:
  [    1.603829]  __x64_sys_getrandom+0x7f/0x130
  [    1.603829]  do_syscall_64+0x57/0x190
  [    1.603829]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
  ...

  All BUG/Oops errors are the same:

  $ dmesg | grep BUG: | sed 's/^.*BUG:/BUG:/' | uniq -c
       22 BUG: kernel NULL pointer dereference, address: 0000000000000038

  And they stop after the DRBG is initialized:

  [    3.651566] random: DRBG (drbg_nopr_ctr_aes256) initialized!

  [Fix Impact Analysis]

  The patch adds a dynamic debug message that can be enabled
  in the kernel cmdline, for comparisons (dmesg); we can also
  compare /proc/crypto for no changes.

  dyndbg="func urandom_read +p"

  Also add break=top, so we can copy /proc/crypto and dmesg
  right after DRBG is initialized (when initramfs is started).

  @ break=top time

   suffix=original # or modified
   cat /proc/crypto > /run/initramfs/proc-crypto.$suffix
   dmesg > /run/initramfs/dmesg.$suffix
   exit

  @ login time
   sudo -s
   cp /run/initramfs/{proc-crypto.*,dmesg.*} .
   reboot # next test

  There's no difference in the list/details of loaded crypto algorithms
  at all, with any combination:

  # md5sum proc-crypto.*
  0b91bd619078fa342c6b4da039cb1582  proc-crypto.modified
  0b91bd619078fa342c6b4da039cb1582  proc-crypto.original

  The kernel with the fix does not hit BUG/Oops errors:

  # grep ^ -m1 dmesg.*
  dmesg.modified:[    0.000000] Linux version 5.4.0-1060-fips ... 
#68+fipsdrbgnullcheck ... 
  dmesg.original:[    0.000000] Linux version 5.4.0-1060-fips ... #68-Ubuntu ...

  # grep -c BUG: dmesg.*
  dmesg.modified:0
  dmesg.original:22

  # grep -c 'random: DRBG uninitialized! crng fallback' dmesg.*
  dmesg.modified:110
  dmesg.original:0

  The 110 number is 5 * 22 calls as modprobe calls getrandom() 5 times (see 
strace above).
  The original kernel has 1 BUG/Oops only because that kills the modprobe task.

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1981487/+subscriptions


-- 
Mailing list: https://launchpad.net/~kernel-packages
Post to     : kernel-packages@lists.launchpad.net
Unsubscribe : https://launchpad.net/~kernel-packages
More help   : https://help.launchpad.net/ListHelp

Reply via email to