Π ΡΠ΄ΡΠ΅ 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 Π°ΡΠ°ΠΊΡΡΡΠΈΠΉ Π½Π΅ ΠΏΡΡΠ°Π΅ΡΡΡ ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΡΡ ΡΠ²ΠΎΠΉ ΠΊΠΎΠ΄ Π² ΠΏΠ°ΠΌΡΡΠΈ, Π° ΠΎΠΏΠ΅ΡΠΈΡΡΠ΅Ρ ΡΠΆΠ΅ ΠΈΠΌΠ΅ΡΡΠΈΠΌΠΈΡΡ Π² Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°Ρ ΠΊΡΡΠΊΠ°ΠΌΠΈ ΠΌΠ°ΡΠΈΠ½Π½ΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ, Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΡ ΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠ΅ΠΉ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ (ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΡΡΠΎ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ). Π Π°Π±ΠΎΡΠ° ΡΠΊΡΠΏΠ»ΠΎΠΈΡΠ° ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΡΠ΅ΠΏΠΎΡΠΊΠΈ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ Π±Π»ΠΎΠΊΠΎΠ² («Π³Π°Π΄ΠΆΠ΅ΡΠΎΠ²») Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π½ΡΠΆΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ.
ΠΠ»Ρ Π°ΡΠ°ΠΊΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π½Π°Π»ΠΈΡΠΈΠ΅ Π΄ΠΎΡΡΡΠΏΠ° Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΎΠΊΠ΅ΡΠΎΠ² CAN ΠΈ Π½Π°ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ vcan. ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ ΡΠΎΠ²Π΅ΡΡΠ΅Π½ΠΈΡ Π°ΡΠ°ΠΊΠΈ ΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡΠΈΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ Π½Π΅ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°Ρ
, ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΡ
Π² ΡΠΈΡΡΠ΅ΠΌΠ°Ρ
Ρ Π²ΠΊΠ»ΡΡΡΠ½Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ² ΠΈΠΌΡΠ½ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ (user namespaces). ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, user namespaces ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π²ΠΊΠ»ΡΡΡΠ½ Π² Ubuntu ΠΈ Fedora, Π½ΠΎ Π½Π΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π½ Π² Debian ΠΈ RHEL.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: opennet.ru