Π ΡΠΎΡΡΠ°Π² Π½Π°Ρ ΠΎΠ΄ΡΡΠ΅Π³ΠΎΡΡ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΠ΄ΡΠ° Linux 5.12 Π²ΠΊΠ»ΡΡΠ΅Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° KFence (Kernel Electric Fence), ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΠ°ΠΌΡΡΡΡ, ΠΎΡΠ»Π°Π²Π»ΠΈΠ²Π°Ρ Π²ΡΡ ΠΎΠ΄ Π·Π° Π³ΡΠ°Π½ΠΈΡΡ Π±ΡΡΠ΅ΡΠΎΠ², ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ ΠΏΠ°ΠΌΡΡΠΈ ΠΏΠΎΡΠ»Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°.
ΠΠΎΠ΄ΠΎΠ±Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ ΡΠΆΠ΅ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΎΠ²Π°Π»Π° Π² ΡΠ΄ΡΠ΅ Π² Π²ΠΈΠ΄Π΅ ΠΎΠΏΡΠΈΠΈ ΡΠ±ΠΎΡΠΊΠΈ KASAN (kernel address sanitizer, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Address Sanitizer Π² ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ gcc ΠΈ clang) — ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π»Π°ΡΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ. ΠΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ° KFence ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ KASAN Π²ΡΡΠΎΠΊΠΎΠΉ ΡΠΊΠΎΡΠΎΡΡΡΡ ΡΠ°Π±ΠΎΡΡ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄Π°ΠΆΠ΅ Π½Π° ΡΠ΄ΡΠ°Ρ Π² ΡΠ°Π±ΠΎΡΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ .
ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΡΠ»Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΠ°ΠΌΡΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΠΏΡΠΎΡΠ²Π»ΡΡΡΡΡ Π² ΡΠ΅ΡΡΠΎΠ²ΡΡ Π·Π°ΠΏΡΡΠΊΠ°Ρ ΠΈ Π²ΡΠΏΠ»ΡΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΡΠ°Π±ΠΎΡΠΈΡ Π½Π°Π³ΡΡΠ·ΠΊΠ°Ρ ΠΈΠ»ΠΈ ΠΏΡΠΈ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΠ΅ (ΠΏΡΠΈ Π±ΠΎΠ»ΡΡΠΎΠΌ uptime). ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ KFence Π½Π° ΡΠ°Π±ΠΎΡΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΡΠΈΡΠ»ΠΎ ΠΌΠ°ΡΠΈΠ½, Π²ΠΎΠ²Π»Π΅ΡΡΠ½Π½ΡΡ Π² ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΡΠ°Π±ΠΎΡΡ ΡΠ΄ΡΠ° Ρ ΠΏΠ°ΠΌΡΡΡΡ.
ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ Π½Π°ΠΊΠ»Π°Π΄Π½ΡΠ΅ ΡΠ°ΡΡ ΠΎΠ΄Ρ, Π½Π΅ Π·Π°Π²ΠΈΡΡΡΠΈΠ΅ ΠΎΡ Π½Π°Π³ΡΡΠ·ΠΊΠΈ, Π΄ΠΎΡΡΠΈΠ³Π°ΡΡΡΡ Π² KFence Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΡΡΡΠ°Π½ΠΈΡ Π·Π°ΡΠΈΡΡ (guard pages) Π² ΠΊΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Ρ. ΠΠΎΡΠ»Π΅ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π° Π·Π°ΡΠΈΡΡ KFence ΡΠ΅ΡΠ΅Π· ΡΡΠ°ΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ (SLAB ΠΈΠ»ΠΈ SLUB allocator) Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ Π·Π°ΡΠΈΡΡ ΠΈΠ· ΠΏΡΠ»Π° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² KFence, ΠΈ Π½Π°ΡΠΈΠ½Π°Π΅Ρ Π½ΠΎΠ²ΡΠΉ ΠΎΡΡΡΡ ΡΡΡΡΡΠΈΠΊΠ° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ KFence ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΡΡΡ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅ ΠΏΠ°ΠΌΡΡΠΈ, Π° ΡΡΡΠ°Π½ΠΈΡΡ ΠΏΠ°ΠΌΡΡΠΈ ΠΏΠΎ Π»Π΅Π²ΠΎΠΉ ΠΈ ΠΏΡΠ°Π²ΠΎΠΉ Π³ΡΠ°Π½ΠΈΡΠ΅ ΠΎΠ±ΡΠ°Π·ΡΡΡ ΡΡΡΠ°Π½ΠΈΡΡ Π·Π°ΡΠΈΡΡ (guard pages), ΡΠ°Π·ΠΌΠ΅Ρ ΠΊΠΎΡΠΎΡΡΡ Π²ΡΠ±ΠΈΡΠ°Π΅ΡΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΡΠ°Π½ΠΈΡΡ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΠΎΡΠ΄Π΅Π»ΡΡΡΡΡ Π΄ΡΡΠ³ ΠΎΡ Π΄ΡΡΠ³Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΠΌΠΈ Π·Π°ΡΠΈΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°ΡΡΡΡ Π½Π° Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ «page fault» ΠΏΡΠΈ Π»ΡΠ±ΠΎΠΌ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΈ. ΠΠ»Ρ Π²ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π·Π°ΠΏΠΈΡΠΈ Π·Π° Π³ΡΠ°Π½ΠΈΡΡ Π±ΡΡΠ΅ΡΠ° Π²Π½ΡΡΡΠΈ ΡΡΡΠ°Π½ΠΈΡ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ «ΠΊΡΠ°ΡΠ½ΡΠ΅ Π·ΠΎΠ½Ρ» Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°ΡΡ ΠΏΠ°ΠΌΡΡΡ, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ, ΠΎΡΡΠ°ΡΡΡΡΡΡ ΠΏΡΠΈ Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π½ΠΈΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΡΡΠ°Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ. —+————+————+————+————+————+— | xxxxxxxxx | O : | xxxxxxxxx | : O | xxxxxxxxx | | xxxxxxxxx | B : | xxxxxxxxx | : B | xxxxxxxxx | | x GUARD x | J : RED- | x GUARD x | RED- : J | x GUARD x | | xxxxxxxxx | E : ZONE | xxxxxxxxx | ZONE : E | xxxxxxxxx | | xxxxxxxxx | C : | xxxxxxxxx | : C | xxxxxxxxx | | xxxxxxxxx | T : | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—
Π ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎΠΏΡΡΠΊΠΈ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ ΠΎΠ±Π»Π°ΡΡΠΈ Π²Π½Π΅ Π³ΡΠ°Π½ΠΈΡ Π±ΡΡΠ΅ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π·Π°ΡΡΠ°Π³ΠΈΠ²Π°Π΅Ρ ΡΡΡΠ°Π½ΠΈΡΡ Π·Π°ΡΠΈΡΡ, ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ «page fault», ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠ΅ΡΠ΅Ρ
Π²Π°ΡΡΠ²Π°Π΅Ρ KFence ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π² Π»ΠΎΠ³ Π΄Π°Π½Π½ΡΠ΅ ΠΎ Π²ΡΡΠ²Π»Π΅Π½Π½ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ΅. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ KFence Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΎΡΠΈΠ±ΠΊΡ ΠΈ Π»ΠΈΡΡ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² Π»ΠΎΠ³, Π½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° «panic_on_warn», ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ°Ρ Π² ΡΠ»ΡΡΠ°Π΅ Π²ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡ ΡΠ΄ΡΠΎ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΊΡΠ°Ρ
Π° (panic).
ΠΡΡΠΎΡΠ½ΠΈΠΊ: opennet.ru