Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Π² ядрС Linux, Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°ΡŽΡ‰Π°Ρ сСтСвой ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» CAN BCM

Π’ ядрС Linux выявлСна ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ (CVE-2021-3609), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ свои ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ Π² систСмС. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π²Ρ‹Π·Π²Π°Π½Π° состояниСм Π³ΠΎΠ½ΠΊΠΈ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° CAN BCM ΠΈ проявляСтся Π² выпусках ядра Linux с 2.6.25 ΠΏΠΎ 5.13-rc6. Π’ дистрибутивах ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΠΎΠΊΠ° остаётся нСисправлСнной (RHEL, Fedora, Debian, Ubuntu, SUSE, Arch).

Π’Ρ‹ΡΠ²ΠΈΠ²ΡˆΠΈΠΉ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ смог ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ эксплоит для получСния ΠΏΡ€Π°Π² root Π½Π° систСмах с ядрами Linux 5.4 ΠΈ Π½ΠΎΠ²Π΅Π΅, Π² Ρ‚ΠΎΠΌ числС ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ провСдСния Π°Ρ‚Π°ΠΊΠΈ Π² Ubuntu 20.04.02 LTS. НС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ эксплоита ΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±ΠΎΠ»Π΅Π΅ старыми ядрами (Π² ядрС 5.4 ΠΊΠΎΠ΄ CAN BCM (net/can/bcm.c) Π±Ρ‹Π» ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Ρ‘Π½ с hrtimer_tasklet Π½Π° HRTIMER_MODE_SOFT).

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» CAN BCM позволяСт Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ собствСнный ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСний, ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… Ρ‡Π΅Ρ€Π΅Π· ΡˆΠΈΠ½Ρƒ CAN (controller area network), ΠΈ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌΡƒ сСтСвому сокСту. ΠŸΡ€ΠΈ поступлСнии входящСго сообщСния вызываСтся функция bcm_rx_handler(). ΠΡ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ состояниСм Π³ΠΎΠ½ΠΊΠΈ ΠΈ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ закрытия сСтСвого сокСта ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ bcm_rx_handler(). ΠŸΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ сокСта вызываСтся функция bcm_release(), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ освобоТдаСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ, выдСлСнная для структур bcm_op ΠΈ bcm_sock, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Π΅Ρ‰Ρ‘ выполняСмом ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ bcm_rx_handler(). Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ситуация, приводящая ΠΊ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΡŽ ΠΊ ΡƒΠΆΠ΅ освобоТдённому Π±Π»ΠΎΠΊΡƒ памяти (use-after-free).

Атака сводится ΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΡŽ Π΄Π²ΡƒΡ… сокСтов CAN BCM ΠΈ привязкС ΠΈΡ… ΠΊ интСрфСйсу vcan. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ сокСтС выполняСтся Π²Ρ‹Π·ΠΎΠ² sendmsg() с Ρ„Π»Π°Π³ΠΎΠΌ RX_SETUP для настройки ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… сообщСний CAN, Π° Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ сокСтС ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π²Ρ‹Π·ΠΎΠ² sendmsg() для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСния Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ сокСт. ПослС поступлСния сообщСния срабатываСт Π²Ρ‹Π·ΠΎΠ² bcm_rx_handler(), Π° Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ΄Π±ΠΈΡ€Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ сокСт, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ запуску bcm_release() ΠΈ освобоТдСнию структур bcm_op ΠΈ bcm_sock, хотя Ρ€Π°Π±ΠΎΡ‚Π° bcm_rx_handler() Π΅Ρ‰Ρ‘ Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°.

Π§Π΅Ρ€Π΅Π· манипуляции с содСрТимым bcm_sock Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sk->sk_data_ready(sk), ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΡ€ΠΈΡ‘ΠΌΠΎΠ² Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования (ROP — Return-Oriented Programming) ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° modprobe_path ΠΈ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ выполнСния своСго ΠΊΠΎΠ΄Π° с ΠΏΡ€Π°Π²Π°ΠΌΠΈ root. ΠŸΡ€ΠΈ использовании Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ ROP Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ Π½Π΅ пытаСтся Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ свой ΠΊΠΎΠ΄ Π² памяти, Π° ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΠΈΡΡ Π² Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… кусками ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Ρ… инструкций, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΡ…ΡΡ инструкциСй Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° управлСния (ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, это окончания Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ). Π Π°Π±ΠΎΡ‚Π° эксплоита сводится ΠΊ ΠΏΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΡŽ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² («Π³Π°Π΄ΠΆΠ΅Ρ‚ΠΎΠ²») для получСния Π½ΡƒΠΆΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Π² ядрС Linux, Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°ΡŽΡ‰Π°Ρ сСтСвой ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» CAN BCM

Для Π°Ρ‚Π°ΠΊΠΈ трСбуСтся Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ доступа для создания сокСтов CAN ΠΈ настроСнный сСтСвой интСрфСйс vcan. НСобходимыС для ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π°Ρ‚Π°ΠΊΠΈ полномочия ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ Π½Π΅ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ…, создаваСмых Π² систСмах с Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ пространств ΠΈΠΌΡ‘Π½ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ (user namespaces). НапримСр, user namespaces ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Π² Ubuntu ΠΈ Fedora, Π½ΠΎ Π½Π΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½ Π² Debian ΠΈ RHEL.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru