Google ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π» GWPSan, инструмСнт для выявлСния ошибок Π½Π° стадии выполнСния ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Компания Google ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»Π° исходныС тСксты инструмСнтария GWPSan, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ для выявлСния ошибок Π½Π° этапС выполнСния ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, собранных для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ x86-64 ΠΈ ARM64. GWPSan собираСтся Π² Π²ΠΈΠ΄Π΅ раздСляСмой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, которая связываСтся ΠΏΡ€ΠΈ запускС прилоТСния ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ LD_PRELOAD ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для Π°Π½Π°Π»ΠΈΠ·Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ доступныС Π² ядрС Linux ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ остановки (PERF_TYPE_BREAKPOINT) ΠΈ сэмплинга процСссов. Код написан Π½Π° языкС Π‘++ ΠΈ распространяСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ Apache 2.0.

GWPSan ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ Π² Π²ΠΈΠ΄Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… классов ошибок. GWPSan выполняСт динамичСский Π°Π½Π°Π»ΠΈΠ·, Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ сигналов, Ρ‡Ρ‚ΠΎ позволяСт ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π±Π΅Π· измСнСния исполняСмого ΠΊΠΎΠ΄Π° прилоТСния. Для эффСктивной Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² трСбуСтся сборка прилоТСния с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌΠΈ Ρ„Π»Π°Π³Π°ΠΌΠΈ компилятора, Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ трСбуСтся ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Clang 18 ΠΈ ядро Linux 6.4.

Π’ настоящСС врСмя доступно Ρ‚Ρ€ΠΈ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€Π°:

  • UAR (Use-after-return) — выявляСт ошибки, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Π΅ использованиСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² стСкС послС Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Ρ‹Π» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½. Π—Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π° Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ Ρ‚ΠΎΡ‡Π΅ΠΊ Π²Ρ…ΠΎΠ΄Π° ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π° для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ — ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ осущСствляСтся ΠΏΠΎΠ΄ΠΌΠ΅Π½Π° стСка Π½Π° копию для использования Π²ΠΎ врСмя выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ возвращаСтся староС состояниС стСка.
  • TSan (Thread Sanitizer) — опрСдСляСт состояния Π³ΠΎΠ½ΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ (Data-race), Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰Π΅Π΅ ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·Π½Ρ‹Π΅ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ выполняСмыС ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠ΅ области памяти, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€ΠΈ этом ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ для синхронизации Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π—Π°Ρ‰ΠΈΡ‚Π° построСна Π½Π° использовании Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ останова, привязываСмых ΠΊ совмСстным областям памяти. Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π° нСбольшой ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ приостанавливаСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ памяти ΠΈ Π²ΠΎ врСмя этой приостановки провСряСт Π½Π΅ Π±Ρ‹Π»ΠΎ Π»ΠΈ срабатывания Ρ‚ΠΎΡ‡ΠΊΠΈ останова для Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.
  • LMSan (Lightweight Memory Sanitizer) — опрСдСляСт использованиС Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² памяти. Π”Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ Π½Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ для использования.

GWPSan Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ исполняСмый ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ DynamoRIO для дСкодирования машинного ΠΊΠΎΠ΄Π° Π² абстрактныС инструкции ISA, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ с использованиСм эмуляции. Π§Π΅Ρ€Π΅Π· пСриодичСскиС сигналы ΠΎΡ‚ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° вызываСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ unified, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ выполняСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΡƒΡŽ ΠΏΠΎΡ€Ρ†ΠΈΡŽ инструкций для Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π’ случаС обнаруТСния ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… инструкций, запускаСтся спСцифичный для Π΄Π°Π½Π½Ρ‹Ρ… инструкций Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для инструкций, ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΡ…ΡΡ ΠΊ памяти, запускаСтся Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ состояний Π³ΠΎΠ½ΠΊΠΈ.

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