lshw segfaults sur Linux> = 4,8 en raison de l'usercopy durci sur de nombreux ordinateurs

Nous utilisons une image de démarrage opsi.org personnalisée pour installer automatiquement Windows sur les ordinateurs clients des clients. Le userland de cette image de démarrage est basé sur une image de démarrage en amont, avec quelques modifications de notre part, et un kernel provenant d'Ubuntu.

Depuis que nous avons mis à jour le kernel vers Linux 4.8.0-42.45 à partir d'Ubuntu, nous avons commencé à recevoir des plaintes de la part de nos clients sur le fait que l'installation s'arrête à cause d'un lshw :

 [7] [Apr 27 23:29:08] Expecting compressed data from server (JSONRPC.py|660) [5] [Apr 27 23:29:08] Running hardware inventory (setup.py|140) [7] [Apr 27 23:29:08] Command 'lshw' found at: '/usr/bin/lshw' (Posix.py|640) [6] [Apr 27 23:29:08] Executing: /usr/bin/lshw -xml 2>/dev/null (Posix.py|660) [6] [Apr 27 23:29:08] Using encoding 'UTF-8' (Posix.py|691) [7] [Apr 27 23:29:08] Exit code: 139 (Posix.py|748) [2] [Apr 27 23:29:09] Traceback: (Logger.py|742) [2] [Apr 27 23:29:09] line 1390 in '<module>' in file '/usr/local/bin/master.py' (Logger.py|742) [2] [Apr 27 23:29:09] line 141 in '<module>' in file '/tmp/setup.py' (Logger.py|742) [2] [Apr 27 23:29:09] line 2482 in 'auditHardware' in file '/usr/lib/pymodules/python2.6/OPSI/System/Posix.py' (Logger.py|742) [2] [Apr 27 23:29:09] line 2526 in 'hardwareInventory' in file '/usr/lib/pymodules/python2.6/OPSI/System/Posix.py' (Logger.py|742) [2] [Apr 27 23:29:09] line 755 in 'execute' in file '/usr/lib/pymodules/python2.6/OPSI/System/Posix.py' (Logger.py|742) [2] [Apr 27 23:29:09] ==>>> Command '/usr/bin/lshw -xml 2>/dev/null' failed (139): (master.py|1438) 

Dans le même time, l'erreur suivante est enregistrée dans dmesg :

 [ 69.852348] usercopy: kernel memory exposure attempt detected from c0080000 (dma-kmalloc-512) (4096 bytes) [ 69.852365] ------------[ cut here ]------------ [ 69.852367] kernel BUG at /build/linux-7qXOmc/linux-4.8.0/mm/usercopy.c:75! [ 69.852370] invalid opcode: 0000 [#1] SMP [ 69.852371] Modules linked in: arc4 md4 nls_utf8 cifs fscache joydev rtsx_usb_ms memstick snd_hda_intel rtsx_usb_sdmmc snd_hda_codec snd_hda_core acer_wmi snd_hwdep rtsx_usb r8169 fjes video sparse_keymap snd_pcm mii mei_txe wmi input_leds snd_timer mac_hid snd mei lpc_ich ahci libahci intel_smartconnect soundcore [ 69.852399] CPU: 0 PID: 1528 Comm: lshw Not tainted 4.8.0-42-generic #45-Ubuntu [ 69.852400] Hardware name: Acer Extensa 2508/Extensa 2508, BIOS V1.10 12/15/2014 [ 69.852402] task: f6d16f00 task.stack: f6cc6000 [ 69.852405] EIP: 0060:[<dd1f7543>] EFLAGS: 00010282 CPU: 0 [ 69.852411] EIP is at __check_object_size+0x123/0x12c [ 69.852413] EAX: 0000005e EBX: c0080000 ECX: 00000247 EDX: 00000247 [ 69.852414] ESI: 00001000 EDI: dda5944f EBP: f6cc7ee0 ESP: f6cc7eb8 [ 69.852416] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 [ 69.852418] CR0: 80050033 CR2: bf910000 CR3: 36883e40 CR4: 001006f0 [ 69.852419] Stack: [ 69.852420] dda5f86c dda628ce dda97569 c0080000 f1402080 00001000 c0081000 c0080000 [ 69.852427] 00090000 00001000 f6cc7f1c dd5074d6 00000000 00001000 bf900678 00010000 [ 69.852434] 00080000 00000000 00090000 00000000 00090000 00000000 dd507430 f6cc7f60 [ 69.852440] Call Trace: [ 69.852447] [<dd5074d6>] read_mem+0xa6/0x1f0 [ 69.852451] [<dd507430>] ? write_mem+0x1f0/0x1f0 [ 69.852454] [<dd1fb15f>] __vfs_read+0x1f/0x50 [ 69.852457] [<dd1fb85f>] vfs_read+0x7f/0x140 [ 69.852461] [<dd80a0a0>] ? down_write+0x10/0x40 [ 69.852465] [<dd1fc9e9>] SyS_read+0x49/0xb0 [ 69.852469] [<dd0037cd>] do_fast_syscall_32+0x8d/0x140 [ 69.852472] [<dd80c07a>] sysenter_past_esp+0x47/0x75 [ 69.852473] Code: 89 74 24 14 0f 44 ca ba ce 28 a6 dd 89 44 24 10 0f 44 d7 89 5c 24 0c 89 4c 24 08 89 54 24 04 c7 04 24 6c f8 a5 dd e8 15 91 f8 ff <0f> 0b b8 97 28 a6 dd eb b9 55 89 e5 57 56 53 83 ec 1c 3e 8d 74 [ 69.852516] EIP: [<dd1f7543>] __check_object_size+0x123/0x12c SS:ESP 0068:f6cc7eb8 [ 69.852523] ---[ end trace 5b12719d45b0befe ]--- 

Je suppose qu'il y a soit un bogue dans lshw , sous Linux, soit quelque chose de louche avec le matériel. Le problème affecte beaucoup de machines cependant, donc je décide du matériel défectueux. Le problème semble se produire uniquement sous Linux> = 4.8; au less Linux 4.4 n'est pas affecté. Ceci est probablement dû au fait que l'usercopy hardening a été introduit dans Linux 4.8.

Le problème n'affecte pas toutes les machines (par exemple, cela fonctionne bien dans ma VM VirtualBox, la machine affectée que je teste actuellement avec un ordinateur portable Acer Extensa 2508). Nous utilisons une version de lshw probablement assez ancienne:

 root@testnb:~# uname -a Linux testnb 4.8.0-42-generic #45-Ubuntu SMP Wed Mar 8 20:05:25 UTC 2017 i686 GNU/Linux root@testnb:~# lshw -version B.02.14 root@testnb:~# lshw Segmentation fault 

Je soupçonne que cela pourrait être la cause, alors j'ai compilé statiquement lshw 02.17-1.1 de Debian jessie, mais cela ne fonctionnera pas non plus:

 root@testnb:~# uname -a Linux testnb 4.8.0-42-generic #45-Ubuntu SMP Wed Mar 8 20:05:25 UTC 2017 i686 GNU/Linux root@testnb:~# ./lshw-02.17-static -version B.02.17 root@testnb:~# ./lshw-02.17-static Segmentation fault 

J'ai essayé un packageage de Linux 4.8 d'Ubuntu yakkety qui est un peu plus récent:

 root@testnb:~# uname -a Linux testnb 4.8.0-49-generic #52-Ubuntu SMP Thu Apr 20 09:39:42 UTC 2017 i686 GNU/Linux root@testnb:~# lshw Segmentation fault root@testnb:~# ./lshw-02.17-static Segmentation fault 

Linux 4.10 à partir d'Ubuntu zesty:

 root@testnb:~# uname -a Linux testnb 4.10.0-20-generic #22-Ubuntu SMP Thu Apr 20 09:22:16 UTC 2017 i686 GNU/Linux root@testnb:~# lshw Segmentation fault root@testnb:~# ./lshw-02.17-static Segmentation fault 

Je suis à court de ce qu'il faut faire maintenant. Des idées?

EDIT: J'ai compilé une list des ordinateurs concernés dans nos journaux:

 martin@dogmeat ~/pssh/lshw-segfault-bootimage/output % cat *.out | sed 's/.*DMI: //' | sort | uniq Acer Extensa 2508/Extensa 2508, BIOS V1.09 10/24/2014 (Posix.py|741) Acer Extensa 2508/Extensa 2508, BIOS V1.10 12/15/2014 (Posix.py|741) Dell Inc. Latitude D630 /0KU184, BIOS A17 01/04/2010 (Posix.py|741) Dell Inc. Latitude E5500 /0DW634, BIOS A15 11/05/2009 (Posix.py|741) Dell Inc. Vostro 1015 /047MWF, BIOS A03 09/01/2010 (Posix.py|741) FUJITSU ESPRIMO P910/D3162-A1, BIOS V4.6.5.3 R1.19.0 for D3162-A1x 12/17/2012 (Posix.py|741) FUJITSU ESPRIMO P910/D3162-A1, BIOS V4.6.5.3 R1.22.0 for D3162-A1x 10/15/2013 (Posix.py|741) Hewlett-Packard HP Compaq 6730b (GW687AV)/30DD, BIOS 68PDD Ver. F.10 07/31/2009 (Posix.py|741) Hewlett-Packard HP Compaq 8510p /30C5, BIOS 68MVD Ver. F.0F 02/05/2008 (Posix.py|741) Hewlett-Packard HP EliteBook 2540p/7008, BIOS 68CSU Ver. F.24 09/12/2013 (Posix.py|741) Hewlett-Packard HP EliteBook 8470p/179B, BIOS 68ICF Ver. F.42 05/20/2013 (Posix.py|741) Hewlett-Packard HP ProBook 4720s/1411, BIOS 68AZZ Ver. F.0B 09/16/2010 (Posix.py|741) IBM 1860W25/1860W25, BIOS 70ET40WW (1.04 ) 06/02/2005 (Posix.py|741) IBM 1860WR7/1860WR7, BIOS 70ET66WW (1.26 ) 05/18/2006 (Posix.py|741) LENOVO 80ES/Lenovo B50-30, BIOS 9CCN21WW(V1.06) 04/09/2014 (Posix.py|741) Quanta TW8/SW8/DW8/TW8/SW8/DW8, BIOS A3B92 10/07/2008 (Posix.py|741) To Be Filled By OEM To Be Filled By OEM/ALiveNF6G-GLAN, BIOS P1.70 03/06/2009 (Posix.py|741) TOSHIBA Satellite Pro R50-B/Satellite Pro R50-B, BIOS Version 1.40 09/25/2014 (Posix.py|741) TOSHIBA TECRA M10/Portable PC, BIOS Version 3.00 09/08/2009 (Posix.py|741) 

EDIT2: a essayé lshw partir de Debian stretch, et la version la plus récente de upstream :

 root@testnb:~# uname -a Linux testnb 4.8.0-42-generic #45-Ubuntu SMP Wed Mar 8 20:05:25 UTC 2017 i686 GNU/Linux root@testnb:~# ./lshw-02.18-static Segmentation fault root@testnb:~# ./lshw-static-b1eab6372d Segmentation fault 

EDIT3: Je l'ai maintenant testé avec une dissortingbution Linux propre (un CD Live Ubuntu 17.04) dans une VM VirtualBox, et je peux confirmer que ce problème est reproductible ici – mais seulement avec un lshw 32 bits:

  • 1ère tentative avec un Live CD 64 bits – le lshw fonctionne:

     root@ubuntu:~# uname -a Linux ubuntu 4.10.0-19-generic #21-Ubuntu SMP Thu Apr 6 17:04:57 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux root@ubuntu:~# dpkg -l | grep lshw ii lshw 02.18-0.1ubuntu3 amd64 information about hardware configuration root@ubuntu:~# lshw | wc -l 231 
  • Un de mes builds lshw statique de 32 bits ne le fait pas:

     root@ubuntu:~# ./lshw-02.18-static Segmentation fault 
  • 2ème tentative avec un Live CD 32 bits – maintenant même le lshw ne fonctionne pas:

     root@ubuntu:~# uname -a Linux ubuntu 4.10.0-19-generic #21-Ubuntu SMP Thu Apr 6 17:03:14 UTC 2017 i686 i686 i686 GNU/Linux root@ubuntu:~# dpkg -l | grep lshw ii lshw 02.18-0.1ubuntu3 i386 information about hardware configuration root@ubuntu:~# lshw Segmentation fault 
  • La faute de segmentation ne se produit pas lorsque lshw sans permissions root:

     ubuntu@ubuntu:~$ lshw | wc -l WARNING: you should run this program as super-user. WARNING: output may be incomplete or inaccurate, you should run this program as super-user. 168 

Nous avons essayé VirtualBox sur deux machines différentes (une avec une carte mère ASUSTeK H170-PRO / USB 3.1 et une avec une carte mère ASUSTeK P8H77-M) et avec plusieurs types de machines virtuelles différentes (Microsoft Windows -> Windows 7 (32 bits), Microsoft Windows -> Windows 10 (64 bits), Linux -> Ubuntu (32 bits), et le problème est toujours reproductible.

EDIT4: pour une raison quelconque, j'ai maintenant du mal à reproduire le problème avec notre bootimage dans VirtualBox. Peut-être que cela dépend de la configuration de la machine virtuelle? Il est encore certainement reproductible sur la machine Acer Extensa 2508 cependant. Comme le problème ne semble affecter que les versions 32 bits de lshw , nous travaillons maintenant en utilisant une image de démarrage 64 bits avec une construction statique de 64 bits de lshw sur des machines lshw en charge 64 bits.

Le rapport de bug en amont: http://www.ezix.org/project/ticket/750