Как Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° для Checkmarx ΠΈ Π½Π΅ сойти с ΡƒΠΌΠ°

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π₯Π°Π±Ρ€!

Π’ своСй Ρ€Π°Π±ΠΎΡ‚Π΅ наша компания ΠΎΡ‡Π΅Π½ΡŒ часто ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»ΠΎ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ инструмСнтами статичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π° (SAST). Из ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ ΠΎΠ½ΠΈ всС Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ срСднС. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, всё зависит ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² Π½Ρ‘ΠΌ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅, насколько Ρ…ΠΎΡ€ΠΎΡˆΠΎ эти Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ Π°Π½Π°Π»ΠΈΠ·Π°. На ΠΌΠΎΠΉ взгляд, ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· самых Π³Π»Π°Π²Π½Ρ‹Ρ… ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅Π² ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ инструмСнта SAST являСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ΄ особСнности своих ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π°Π½Π°Π»ΠΈΠ·Π° ΠΈΠ»ΠΈ, ΠΊΠ°ΠΊ ΠΈΡ… Ρ‡Π°Ρ‰Π΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚, Custom Queries.

Как Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° для Checkmarx ΠΈ Π½Π΅ сойти с ΡƒΠΌΠ°

ΠœΡ‹ Ρ‡Π°Ρ‰Π΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Checkmarx — ΠΎΡ‡Π΅Π½ΡŒ интСрСсный ΠΈ ΠΌΠΎΡ‰Π½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠ΄Π°. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я расскаТу ΠΏΡ€ΠΎ свой ΠΎΠΏΡ‹Ρ‚ написания ΠΏΡ€Π°Π²ΠΈΠ» Π°Π½Π°Π»ΠΈΠ·Π° для Π½Π΅Π³ΠΎ.

ОглавлСниС

ВступлСниС

Для Π½Π°Ρ‡Π°Π»Π°, я Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π» ΠΏΠΎΡ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π½Π΅ΠΌΠ½ΠΎΠ³ΠΈΡ… статСй Π½Π° русском языкС ΠΏΡ€ΠΎ особСнности написания запросов для Checkmarx. Она Π±Ρ‹Π»Π° ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π° Π½Π° Π₯Π°Π±Ρ€Π΅ Π² ΠΊΠΎΠ½Ρ†Π΅ 2019 Π³ΠΎΠ΄Π° ΠΏΠΎΠ΄ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ: Β«Hello, Checkmarx!Β». Как Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ запрос для Checkmarx SAST ΠΈ Π½Π°ΠΉΡ‚ΠΈ ΠΊΡ€ΡƒΡ‚Ρ‹Π΅ уязвимости.

Π’ Π½Π΅ΠΉ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассмотрСно, ΠΊΠ°ΠΊ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ запросы Π½Π° языкС CxQL (Checkmarx Query Language) для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ тСстового прилоТСния ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ основныС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ» Π°Π½Π°Π»ΠΈΠ·Π°.

Π― Π½Π΅ Π±ΡƒΠ΄Ρƒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΉ описано, хотя Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ пСрСсСчСния всё-Ρ‚Π°ΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ. Π’ своСй ΡΡ‚Π°Ρ‚ΡŒΠ΅ я ΠΏΠΎΡΡ‚Π°Ρ€Π°ΡŽΡΡŒ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ β€œΡΠ±ΠΎΡ€Π½ΠΈΠΊ рСцСптов”, ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ я сталкивался Π·Π° врСмя своСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Checkmarx. Над ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ ΠΈΠ· этих Π·Π°Π΄Π°Ρ‡ ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ изрядно ΠΏΠΎΠ»ΠΎΠΌΠ°Ρ‚ΡŒ Π³ΠΎΠ»ΠΎΠ²Ρƒ. ΠŸΠΎΡ€ΠΎΠΉ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π»ΠΎ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Π° ΠΏΠΎΡ€ΠΎΠΉ ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ трСбуСтся. НадСюсь, ΠΌΠΎΠΉ ΠΎΠΏΡ‹Ρ‚ ΠΈ бСссонныС Π½ΠΎΡ‡ΠΈ Π½Π΅ ΠΏΡ€ΠΎΠΏΠ°Π΄ΡƒΡ‚ Π΄Π°Ρ€ΠΎΠΌ, ΠΈ этот β€œΡΠ±ΠΎΡ€Π½ΠΈΠΊ Custom Queries рСцСптов” сэкономит Π²Π°ΠΌ нСсколько часов ΠΈΠ»ΠΈ ΠΏΠ°Ρ€Ρƒ-Ρ‚Ρ€ΠΎΠΉΠΊΡƒ Π½Π΅Ρ€Π²Π½Ρ‹Ρ… ΠΊΠ»Π΅Ρ‚ΠΎΠΊ. Π˜Ρ‚Π°ΠΊ, Π½Π°Ρ‡Π½Π΅ΠΌ!

ΠžΠ±Ρ‰Π°Ρ информация ΠΏΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ

Для Π½Π°Ρ‡Π°Π»Π° рассмотрим нСсколько Π±Π°Π·ΠΎΠ²Ρ‹Ρ… понятий ΠΈ процСсс Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ, для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ понимания, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ дальшС. И Π΅Ρ‰Π΅ ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎ это Π½Π΅ сказано ΠΈΠ»ΠΈ сильно Ρ€Π°Π·ΠΌΠ°Π·Π°Π½ΠΎ ΠΏΠΎ структурС, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ.

  1. ΠŸΡ€Π°Π²ΠΈΠ»Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ сканировании Π² зависимости ΠΎΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈ стартС прСсСта (Π½Π°Π±ΠΎΡ€ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΡ€Π°Π²ΠΈΠ»). ΠŸΡ€Π΅ΡΠ΅Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ количСство ΠΈ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΡ… ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ зависит ΠΎΡ‚ особСнностСй вашСго процСсса. МоТно ΡΠ³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎ языкам ΠΈΠ»ΠΈ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ прСсСты для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΡ€Π°Π²ΠΈΠ» влияСт Π½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ сканирования.

    Как Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° для Checkmarx ΠΈ Π½Π΅ сойти с умаНастройка Preset Π² интСрфСйсС Checkmarx

  2. ΠŸΡ€Π°Π²ΠΈΠ»Π° Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ инструмСнтС ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ CxAuditor. Π­Ρ‚ΠΎ дСсктопноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ сСрвСру с Checkmarx. Π£ этого инструмСнта Π΅ΡΡ‚ΡŒ Π΄Π²Π° Ρ€Π΅ΠΆΠΈΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹: Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ» ΠΈ Π°Π½Π°Π»ΠΈΠ· Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ сканирования.

    Как Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° для Checkmarx ΠΈ Π½Π΅ сойти с ΡƒΠΌΠ°Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ CxAudit

  3. ΠŸΡ€Π°Π²ΠΈΠ»Π° Π² Checkmarx Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ ΠΏΠΎ языкам, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ языка сущСствуСт свой Π½Π°Π±ΠΎΡ€ запросов. Π’Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π²Π½Π΅ зависимости ΠΎΡ‚ языка, это Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ запросы. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ своСм, Π±Π°Π·ΠΎΠ²Ρ‹Π΅ запросы содСрТат Π² сСбС поиск ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°.

    Как Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° для Checkmarx ΠΈ Π½Π΅ сойти с ΡƒΠΌΠ°Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ» ΠΏΠΎ языкам

  4. ΠŸΡ€Π°Π²ΠΈΠ»Π° Π±Ρ‹Π²Π°ΡŽΡ‚ β€œExecutable” ΠΈ β€œNon-Executable” (ВыполняСмыС ΠΈ НС выполняСмыС). НС совсСм ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅, Π½Π° ΠΌΠΎΠΉ взгляд, Π½ΠΎ Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ. Π‘ΡƒΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния β€œExecutable” ΠΏΡ€Π°Π²ΠΈΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… сканирования Π² UI, Π° β€œNon-Executable” ΠΏΡ€Π°Π²ΠΈΠ»Π° Π½ΡƒΠΆΠ½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для использования ΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… запросах (ΠΏΠΎ сути — просто функция).

    Как Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° для Checkmarx ΠΈ Π½Π΅ сойти с ΡƒΠΌΠ°ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΡ€ΠΈ создании

  5. МоТно ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ»ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΡΡ‚ΡŒ/ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π΅Π³ΠΎ Π² Π΄Π΅Ρ€Π΅Π²Π΅, Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΈ Π² Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΌ мСню Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΏΡƒΠ½ΠΊΡ‚ β€œOverrideβ€œ. Π’ΡƒΡ‚ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² прСсСты ΠΈ Π½Π΅ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² мСню β€œPreset Manager” Π² инструмСнтС. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Π½Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ свои настройки, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, Ссли ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π±Ρ‹Π»ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ½ΠΎ ΠΈ останСтся ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ сразу.

    Как Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° для Checkmarx ΠΈ Π½Π΅ сойти с ΡƒΠΌΠ°ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π² интСрфСйсС Preset Manager

  6. Π’ΠΎ врСмя выполнСния строится β€œΠ΄Π΅Ρ€Π΅Π²ΠΎβ€ запросов, Ρ‡Ρ‚ΠΎ ΠΎΡ‚ Ρ‡Π΅Π³ΠΎ зависит. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π²Ρ‚ΠΎΡ€Ρ‹ΠΌΠΈ Ρ‚Π΅, ΠΊΡ‚ΠΎ Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΊΡΡˆΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ссли Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°, Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ Ρ‚Π°ΠΊ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, это ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ врСмя сканирования.

  7. ΠŸΡ€Π°Π²ΠΈΠ»Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… уровнях:

  • Для всСй систСмы — Π±ΡƒΠ΄Π΅Ρ‚ использован для любого сканирования любого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

  • На ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ (Team) — Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для сканирования ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π² Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π΅.

  • На ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° — Π‘ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅

    Как Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° для Checkmarx ΠΈ Π½Π΅ сойти с ΡƒΠΌΠ°ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ уровня, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ

β€œΠ‘Π»ΠΎΠ²Π°Ρ€ΡŒβ€œ для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π΅Π³ΠΎ

И Π½Π°Ρ‡Π½Ρƒ я с Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Π΅Ρ‰Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ Ρƒ мСня вопросы, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°ΠΆΡƒ ряд ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сущСствСнно упростят Тизнь.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ со списками

- Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ (list2 - list1)
* пСрСсСчСниС списков (list1 * list2)
+ слоТСниС списков (list1 + list2)

& (логичСскоС И) - ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ списки ΠΏΠΎ совпадСнию (list1 & list2), Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΡΠ΅Ρ‡Π΅Π½ΠΈΡŽ (list1 * list2)
| (логичСскоС Π˜Π›Π˜) - ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ списки ΠΏΠΎ ΡˆΠΈΡ€ΠΎΠΊΠΎΠΌΡƒ поиску (list1 | list2)

Π‘ΠΎ списками Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚:  ^  &&  ||  %  / 

ВсС Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Π΅ элСмСнты

Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… сканируСмого языка ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ всСх элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ» Checkmarx (строки, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, классы, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ Ρ‚.Π΄.). Π­Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ пространство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Ρ‡Π΅Ρ€Π΅Π· All. Π’ΠΎ Π΅ΡΡ‚ΡŒ, для поиска ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ searchMe, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ поиск, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎ всСм Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ:

// Π’Π°ΠΊΠΎΠΉ запрос выдаст всС элСмСнты
result = All;

// Π’Π°ΠΊΠΎΠΉ запрос выдаст всС элСмСнты, Π² ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… присутствуСт β€œsearchMeβ€œ
result = All.FindByName("searchMe");

Но, Ссли Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ поиск ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ языку, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ Π½Π΅ вошСл Π² сканированиС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ groovy Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ для Android), ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ нашС пространство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ:

result = AllMembers.All.FindByName("searchMe");

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Π°Π½Π°Π»ΠΈΠ·Π° Flow

Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ… ΠΈ Π²ΠΎΡ‚ нСбольшая ΡˆΠΏΠ°Ρ€Π³Π°Π»ΠΊΠ°, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚:

// КакиС Π΄Π°Π½Π½Ρ‹Π΅ second Π²Π»ΠΈΡΡŽΡ‚ Π½Π° first.
// Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами - ВО (second) Ρ‡Ρ‚ΠΎ влияСт Π½Π°  ΠœΠ•ΠΠ― (first).
result = first.DataInfluencedBy(second);

// КакиС Π΄Π°Π½Π½Ρ‹Π΅ first Π²Π»ΠΈΡΡŽΡ‚ Π½Π° second.
// Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами - Π― (first) влияю Π½Π° ВО (second).
result = first.DataInfluencingOn(second);

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ/ΠΏΡƒΡ‚ΠΈ Ρ„Π°ΠΉΠ»Π°

Π•ΡΡ‚ΡŒ нСсколько Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² выполнСния запроса (имя Ρ„Π°ΠΉΠ»Π° Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅, строка ΠΈ Ρ‚.Π΄.), Π½ΠΎ ΠΊΠ°ΠΊ ΠΈΡ… ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½Π΅ сказано. Π’Π°ΠΊ Π²ΠΎΡ‚ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ свойству LinePragma ΠΈ ΡƒΠΆΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π³ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½ΡƒΠΆΠ½Ρ‹Π΅ Π½Π°ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹:

// Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π°ΠΉΠ΄Π΅ΠΌ всС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹
CxList methods = Find_Methods();

// Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… Π½Π°ΠΉΠ΄Π΅ΠΌ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ scope
CxList scope = methods.FindByName("scope");

// Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ
string current_filename = scope.GetFirstGraph().LinePragma.FileName;

// А Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΠΌ - строку, Π³Π΄Π΅ нашлось срабатываниС
int current_line = scope.GetFirstGraph().LinePragma.Line;

// Π­Ρ‚ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ Ρ€Π°Π·Π½ΠΎΠΌΡƒ
// НапримСр ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² Ρ„Π°ΠΉΠ»Π΅
CxList inFile = All.FindByFileName(current_filename);

// Или Π½Π°ΠΉΡ‚ΠΈ Ρ‡Ρ‚ΠΎ происходит Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ строкС
CxList inLine = inFile.FindByPosition(current_line);

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ FileName содСрТит Π½Π° самом Π΄Π΅Π»Π΅ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ использовали ΠΌΠ΅Ρ‚ΠΎΠ΄ GetFirstGraph.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния

Π’Π½ΡƒΡ‚Ρ€ΠΈ CxQL прСдусмотрСна ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ пСрСмСнная result, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния вашСго написанного ΠΏΡ€Π°Π²ΠΈΠ»Π°. Она ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° сразу ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π² Π½Π΅Π΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, измСняя ΠΈ уточняя ΠΈΡ… Π² процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹. Но, Ссли Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ присвоСния этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ return— Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ запрос Π½Π΅ Π²Π΅Ρ€Π½Π΅Ρ‚ Π½Π°ΠΌ Π½ΠΈΡ‡Π΅Π³ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния ΠΈ всСгда Π±ΡƒΠ΄Π΅Ρ‚ пустым:

// Находим элСмСнты foo
CxList libraries = All.FindByName("foo");

Но, присвоив Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΊ магичСской ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ result — ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ²:

// Находим элСмСнты foo
CxList libraries = All.FindByName("foo");

// Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€Π°Π²ΠΈΠ»Π°
result = libraries

// Или Π΅Ρ‰Π΅ ΠΊΠΎΡ€ΠΎΡ‡Π΅
result = All.FindByName("foo");

ИспользованиС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² выполнСния Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ»

ΠŸΡ€Π°Π²ΠΈΠ»Π° Π² Checkmarx ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ языкС программирования. ΠŸΡ€ΠΈ написании ΠΏΡ€Π°Π²ΠΈΠ»Π° Π²Ρ‹ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΡ… запросов. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Π½Π΅Ρ‚ нСобходимости ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΈΡΠΊΠ°Ρ‚ΡŒ всС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² ΠΊΠΎΠ΄Π΅, достаточно Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ:

// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°
CxList methods = Find_Methods();

// Π˜Ρ‰Π΅ΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ foo. 
// Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ false ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈΡ‰Π΅ΠΌ Π±Π΅Π· Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊ рСгистру
result = methods.FindByShortName("foo", false);

Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ позволяСт ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ ΠΈ сущСствСнно ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ врСмя выполнСния ΠΏΡ€Π°Π²ΠΈΠ»Π°.

РСшСниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ

Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с инструмСнтом, ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π΅ получаСтся сразу Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ запрос ΠΈ приходится ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, пробуя Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹. Для Ρ‚Π°ΠΊΠΎΠ³ΠΎ случая Π² инструмСнтС прСдусмотрСно Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ вызываСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

// Находим Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ
CxList toLog = All.FindByShortName("log");

// Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ строку ΠΈ отправляСм Π² Π»ΠΎΠ³
cxLog.WriteDebugMessage (β€œnumber of DOM elements =” + All.Count);

Но стоит ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π° Π²Ρ…ΠΎΠ΄ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ строку, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ вывСсти ΠΏΠΎΠ»Π½Ρ‹ΠΉ список Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… элСмСнтов Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ получится. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ — это врСмя ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ магичСской ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ result Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния запроса ΠΈ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ получится. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π΅Π½, Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ΄Π΅ послС Π½Π΅Ρ‚ пСрСопрСдСлСния ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с этим result ΠΈΠ»ΠΈ просто ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ располоТСнный Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄. А ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ°ΠΊ я, Π·Π°Π±Ρ‹Ρ‚ΡŒ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΠΈΠ· Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π° нСсколько Ρ‚Π°ΠΊΠΈΡ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈ ΡƒΠ΄ΠΈΠ²Π»ΡΡ‚ΡŒΡΡ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

Π‘ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ — это Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ return с Π½ΡƒΠΆΠ½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° закончится ΠΈ ΠΌΡ‹ смоТСм ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ написанного Π½Π°ΠΌΠΈ:

// Находим Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ
CxList toLog = All.FindByShortName("log");

// Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния
return toLog

//ВсС, Ρ‡Ρ‚ΠΎ написано дальшС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ
result = All.DataInfluencedBy(toLog)

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с Π»ΠΎΠ³ΠΈΠ½ΠΎΠΌ

Π‘Ρ‹Π²Π°ΡŽΡ‚ ситуации, ΠΊΠΎΠ³Π΄Π° Π½Π΅ получаСтся Π·Π°ΠΉΡ‚ΠΈ Π² инструмСнт CxAudit (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для написания ΠΏΡ€Π°Π²ΠΈΠ»). ΠŸΡ€ΠΈΡ‡ΠΈΠ½ этому ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ, Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹, Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Windows, BSOD ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π½Π΅ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Π½Π½Ρ‹Π΅ ситуации, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ нСподвластны. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΈΠ½ΠΎΠ³Π΄Π° остаСтся Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Π°Ρ сСссия Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, которая Π½Π΅ Π΄Π°Π΅Ρ‚ Π·Π°ΠΉΡ‚ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ. Для исправлСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ нСсколько запросов:

Для Checkmarx Π΄ΠΎ 8.6:

// ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π·Π°Π»ΠΎΠ³ΠΈΠ½Π΅Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² запрос Π² Π‘Π”
SELECT COUNT(*) FROM [CxDB].[dbo].LoggedinUser WHERE [ClientType] = 6;
 
// Если Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, Π° Π½Π° самом Π΄Π΅Π»Π΅ Π΄Π°ΠΆΠ΅ Ссли ΠΈ Π½Π΅Ρ‚, ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ запрос
DELETE FROM [CxDB].[dbo].LoggedinUser WHERE [ClientType] = 6;

Для Checkmarx послС 8.6:

// ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π·Π°Π»ΠΎΠ³ΠΈΠ½Π΅Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² запрос Π² Π‘Π”
SELECT COUNT(*) FROM LoggedinUser WHERE (ClientType = 'Audit');
 
// Если Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, Π° Π½Π° самом Π΄Π΅Π»Π΅ Π΄Π°ΠΆΠ΅ Ссли ΠΈ Π½Π΅Ρ‚, ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ запрос
DELETE FROM [CxDB].[dbo].LoggedinUser WHERE (ClientType = 'Audit');

НаписаниС ΠΏΡ€Π°Π²ΠΈΠ»

Π’ΠΎΡ‚ ΠΈ Π΄ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ Π΄ΠΎ самого интСрСсного. Когда Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΡˆΡŒ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π½Π° CxQL, Ρ‡Π°Ρ‰Π΅ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ Π΄Π°ΠΆΠ΅ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, сколько ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ ΠΆΠΈΠ²Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ ΠΈ описания процСсса Ρ€Π°Π±ΠΎΡ‚Ρ‹ запросов Π² Ρ†Π΅Π»ΠΎΠΌ.

Π― ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΡŽ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Тизнь Ρ‚Π΅ΠΌ, ΠΊΡ‚ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΏΠΎΠ³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ Π² язык запросов ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² использования Custom Queries для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. НСкоторыС ΠΈΠ· Π½ΠΈΡ… достаточно ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹ Π² вашСй ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ практичСски Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ спСцифичныС, Π½ΠΎ ΠΈΡ… Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, помСняв ΠΊΠΎΠ΄ ΠΏΠΎΠ΄ спСцифику Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

Π˜Ρ‚Π°ΠΊ, Π²ΠΎΡ‚ с ΠΊΠ°ΠΊΠΈΠΌΠΈ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ Π½Π°ΠΌ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ Ρ‡Π°Ρ‰Π΅ всСго:

Π—Π°Π΄Π°Ρ‡Π°: Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… выполнСния ΠΏΡ€Π°Π²ΠΈΠ»Π° нСсколько Flow ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… являСтся Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ….

РСшСниС: Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈΠ½ΠΎΠ³Π΄Π° Checkmarx ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ нСсколько Flow двиТСния Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°Ρ‚ΡŒΡΡ ΠΈ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠΎΡ€ΠΎΡ‡Π΅Π½Π½ΠΎΠΉ вСрсиСй Π΄Ρ€ΡƒΠ³ΠΈΡ…. Для Ρ‚Π°ΠΊΠΈΡ… случаСв Π΅ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ReduceFlow. Π’ зависимости ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΠ½ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ самый ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ ΠΈΠ»ΠΈ самый Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ Flow:

// ΠžΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ Flow
result = result.ReduceFlow(CxList.ReduceFlowType.ReduceSmallFlow);

// ΠžΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ Flow
result = result.ReduceFlow(CxList.ReduceFlowType.ReduceBigFlow);

Π—Π°Π΄Π°Ρ‡Π°: Π Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ инструмСнт

РСшСниС: Π’ Checkmarx ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ запросы. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΠ² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ» Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, спСцифичными для вашСго прилоТСния, ΠΌΠΎΠΆΠ½ΠΎ сразу ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ сканирования. НиТС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€Π°Π²ΠΈΠ»Π°, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ:

General_privacy_violation_list

Π”ΠΎΠ±Π°Π²ΠΈΠΌ нСсколько ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² нашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ для хранСния Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ:

// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°
result = base.General_privacy_violation_list();

// Π˜Ρ‰Π΅ΠΌ элСмСнты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ ΠΏΠΎΠ΄ простыС рСгулярныС выраТСния. МоТно Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Ρ‹ΠΌΠΈ для вас ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°ΠΌΠΈ.
CxList personalList = All.FindByShortNames(new List<string> {
	"*securityToken*", "*sessionId*"}, false);

// ДобавляСм ΠΊ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ
result.Add(personalList);

Π—Π°Π΄Π°Ρ‡Π°: Π Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… с паролями

РСшСниС: Π― Π±Ρ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π» сразу ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ Π² ΠΊΠΎΠ΄Π΅ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ список ΠΈΠΌΡ‘Π½ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ принято ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² вашСй ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ.

Password_privacy_violation_list

CxList allStrings = All.FindByType("String"); 
allStrings.Add(All.FindByType(typeof(StringLiteral))); 
allStrings.Add(Find_UnknownReference());
allStrings.Add(All.FindByType(typeof (Declarator)));
allStrings.Add(All.FindByType(typeof (MemberAccess)));
allStrings.Add(All.FindByType(typeof(EnumMemberDecl))); 
allStrings.Add(Find_Methods().FindByShortName("get*"));

// ДополняСм Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹ΠΉ список ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…
List < string > pswdIncludeList = new List<string>{"*password*", "*psw", "psw*", "pwd*", "*pwd", "*authKey*", "pass*", "cipher*", "*cipher", "pass", "adgangskode", "benutzerkennwort", "chiffre", "clave", "codewort", "contrasena", "contrasenya", "geheimcode", "geslo", "heslo", "jelszo", "kennwort", "losenord", "losung", "losungswort", "lozinka", "modpas", "motdepasse", "parol", "parola", "parole", "pasahitza", "pasfhocal", "passe", "passord", "passwort", "pasvorto", "paswoord", "salasana", "schluessel", "schluesselwort", "senha", "sifre", "wachtwoord", "wagwoord", "watchword", "zugangswort", "PAROLACHIAVE", "PAROLA CHIAVE", "PAROLECHIAVI", "PAROLE CHIAVI", "paroladordine", "verschluesselt", "sisma",
                "pincode",
								"pin"};
								
List < string > pswdExcludeList = new List<string>{"*pass", "*passable*", "*passage*", "*passenger*", "*passer*", "*passing*", "*passion*", "*passive*", "*passover*", "*passport*", "*passed*", "*compass*", "*bypass*", "pass-through", "passthru", "passthrough", "passbytes", "passcount", "passratio"};

CxList tempResult = allStrings.FindByShortNames(pswdIncludeList, false);
CxList toRemove = tempResult.FindByShortNames(pswdExcludeList, false);
tempResult -= toRemove;
tempResult.Add(allStrings.FindByShortName("pass", false));

foreach (CxList r in tempResult)
{
	CSharpGraph g = r.data.GetByIndex(0) as CSharpGraph;
	if(g != null && g.ShortName != null && g.ShortName.Length < 50)
	{
		result.Add(r);
	}
}

Π—Π°Π΄Π°Ρ‡Π°: Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Checkmarx

РСшСниС: ВсС запросы Π² Checkmarx Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ ΠΏΠΎ языкам, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ языка. НиТС нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ».

Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΈΠ»ΠΈ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ стандартный Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» — ΠΈΡ… Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ. Π’ΠΎΠ³Π΄Π° всС, ΠΊΡ‚ΠΎ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ — сразу ΡƒΠ·Π½Π°ΡŽΡ‚ ΠΎ Π½ΠΎΠ²Ρ‹Ρ… Π²Π²ΠΎΠ΄Π½Ρ‹Ρ…. Как ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для логирования Π² Android — Timber ΠΈ Loggi. Π’ Π±Π°Π·ΠΎΠ²ΠΎΠΉ поставкС ΠΏΡ€Π°Π²ΠΈΠ» опрСдСлСния Π½Π΅ систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π½Π΅Ρ‚, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ссли ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΈΠ»ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ сСссии ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚ Π² Π»ΠΎΠ³, ΠΌΡ‹ ΠΎΠ± этом Π½Π΅ ΡƒΠ·Π½Π°Π΅ΠΌ. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΏΡ€Π°Π²ΠΈΠ»Π° Checkmarx опрСдСлСния Ρ‚Π°ΠΊΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².

ВСстовый ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Timber для логирования:

package com.death.timberdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import timber.log.Timber;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Timber.e("Error Message");
        Timber.d("Debug Message");

        Timber.tag("Some Different tag").e("And error message");
    }
}

А Π²ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ запроса для Checkmarx, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Timber, ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ‹Ρ…ΠΎΠ΄Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· прилоТСния:

FindAndroidOutputs

// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°
result = base.Find_Android_Outputs();

// ДополняСм Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ приходят ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Timber
CxList timber = All.FindByExactMemberAccess("Timber.*") +
    All.FindByShortName("Timber").GetMembersOfTarget();

// ДобавляСм ΠΊ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ
result.Add(timber);

И Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сосСднСС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½ΠΎ ΡƒΠΆΠ΅ относящССся нСпосрСдствСнно ΠΊ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Π² Android:

FindAndroidLog_Outputs

// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°
result = base.Find_Android_Log_Outputs();

// ДополняСм Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ приходят ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Timber
result.Add(
  All.FindByExactMemberAccess("Timber.*") +
  All.FindByShortName("Timber").GetMembersOfTarget()
);

Π’Π°ΠΊΠΆΠ΅, Ссли Π² Android-прилоТСниях ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ WorkManager для асинхронной Ρ€Π°Π±ΠΎΡ‚Ρ‹, Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎΠ± этом Checkmarx, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄ получСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π·Π°Π΄Π°Ρ‡ΠΈ getInputData:

FindAndroidRead

// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°
result = base.Find_Android_Read();

// ДополняСм Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getInputData, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² WorkManager
CxList getInputData = All.FindByShortName("getInputData");

// ДобавляСм ΠΊ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ
result.Add(getInputData.GetMembersOfTarget());

Π—Π°Π΄Π°Ρ‡Π°: Поиск Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² plist для iOS ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²

РСшСниС: Часто для хранСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² iOS ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .plist. Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ, Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² этих Ρ„Π°ΠΉΠ»Π°Ρ… Π½Π΅ рСкомСндуСтся, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π±Π΅Π· особых ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Ρ‹ ΠΈΠ· устройства.

Π€Π°ΠΉΠ»Ρ‹ plist ΠΈΠΌΠ΅ΡŽΡ‚ особСнности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ Π½Π΅Π²ΠΎΠΎΡ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΌΡƒ Π³Π»Π°Π·Ρƒ, Π½ΠΎ Π²Π°ΠΆΠ½Ρ‹ для Checkmarx. НапишСм ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ Π½Π°ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ Π½Π°ΠΌ, Ссли Π³Π΄Π΅-Ρ‚ΠΎ ΡƒΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‚ΡΡ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΈΠ»ΠΈ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π·Π°ΡˆΠΈΡ‚ Ρ‚ΠΎΠΊΠ΅Π½ для общСния с сСрвисом backend:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>DeviceDictionary</key>
	<dict>
		<key>phone</key>
		<string>iPhone 6s</string>
	</dict>
	<key>privatekey</key>
	<string>MIICXAIBAAKBgQCqGKukO1De7zhZj6+</string>
</dict>
</plist>

И ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ для Checkmarx, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΅ΡΡ‚ΡŒ нСсколько нюансов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ слСдуСт ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ написании:

// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΠΎ поиску Ρ„Π°ΠΉΠ»ΠΎΠ² plist, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈ 
CxList plist = Find_Plist_Elements();

// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ
CxList dictionarySettings = All.NewCxList();

// Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ поиск всСх ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΡ… нас Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π’ дальнСйшСм ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ этот список.
// Для поиска Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠ°ΠΊ Π½ΠΈ странно, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ FindByMemberAccess - поиск ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, false, ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ поиск нСчувствитСлСн ΠΊ рСгистру
dictionarySettings.Add(plist.FindByMemberAccess("privatekey", false));
dictionarySettings.Add(plist.FindByMemberAccess("privatetoken", false));

// Для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ поиска ΠΈΠ·-Π·Π° особСнностСй структуры plist - Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ "If statement"
CxList ifStatements = plist.FindByType(typeof(IfStmt));

// ДобавляСм Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΏΠ΅Ρ€Π΅Π΄ этим ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΡƒΠ·Π΅Π» - для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ отобраТСния
result = dictionarySettings.FindByFathers(ifStatements);

Π—Π°Π΄Π°Ρ‡Π°: Поиск ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² XML

РСшСниС: Π’ Checkmarx Π΅ΡΡ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с XML ΠΈ поиском Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, тэгов, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ. Но Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, ΠΊ соТалСнию, Π΄ΠΎΠΏΡƒΡ‰Π΅Π½Π° ошибка ΠΈΠ·-Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² послСднСй вСрсии Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ этот Π½Π΅Π΄ΠΎΡ‡Π΅Ρ‚ устранСн — Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹, Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΠ΅ вСрсии Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

Π’ΠΎΡ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ:

// Код Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚
result = All.FindXmlAttributesByNameAndValue("*.app", 8, β€œid”, "error- section", false, true);

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ выполнСния ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ρ‡Ρ‚ΠΎ Ρƒ All Π½Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ мСтода… И это Π²Π΅Ρ€Π½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ для использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с XML Π΅ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅, ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ пространство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² — cxXPath. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ запрос для поиска настройки Π² Android, Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅ΠΉ использованиС HTTP Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°:

// ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ с использованиСм cxXPath
result = cxXPath.FindXmlAttributesByNameAndValue("*.xml", 8, "cleartextTrafficPermitted", "true", false, true);

Π Π°Π·Π±Π΅Ρ€Π΅ΠΌ Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ синтаксис Ρƒ всСх Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΉ, послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ разобрался с ΠΎΠ΄Π½ΠΎΠΉ, дальшС Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΡƒΡŽ. Π˜Ρ‚Π°ΠΊ, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ:

  • "*.xml"— маска Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ поиск

  • 8 — id языка, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ примСняСтся ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ

  • "cleartextTrafficPermitted"— имя Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Π² xml

  • "true" — Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°

  • false — использованиС рСгулярного выраТСния ΠΏΡ€ΠΈ поискС

  • true — ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ поиск Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ с ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ рСгистра, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ case-insensitive

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° использовано ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ опрСдСляСт Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Π΅, с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния бСзопасности, настройки сСтСвого соСдинСния Π² Android, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‚ ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ с сСрвСром посрСдством ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° HTTP. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ настройки, содСрТащий Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ cleartextTrafficPermitted со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ true:

<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        </trust-anchors>
        <domain-config cleartextTrafficPermitted="true">
            <domain includeSubdomains="true">secure.example.com</domain>
        </domain-config>
    </domain-config>
</network-security-config>

Π—Π°Π΄Π°Ρ‡Π°: ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ/ΠΏΡƒΡ‚ΠΈ Ρ„Π°ΠΉΠ»Π°

РСшСниС: Π’ ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², связанных с Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ мобильного прилоТСния ΠΏΠΎΠ΄ Android, ΠΌΡ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с Π»ΠΎΠΆΠ½Ρ‹ΠΌΠΈ срабатываниями ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ опрСдСляСт настройку обфускации. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ ΠΈΡ‰Π΅Ρ‚ Π² Ρ„Π°ΠΉΠ»Π΅ build.gradle настройку, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΡƒΡŽ Π·Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ» обфускации для Ρ€Π΅Π»ΠΈΠ·Π½ΠΎΠΉ вСрсии прилоТСния.

Но Π² Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… ΠΈΠ½ΠΎΠ³Π΄Π° Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ build.gradle, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ относятся ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ Ссли Π² этих Ρ„Π°ΠΉΠ»Π°Ρ… Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ обфускации, ΠΏΡ€ΠΈ компиляции Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ настройки Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° сборки.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π·Π°Π΄Π°Ρ‡Π° стоит Π² отсСчСнии срабатываний Π² Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ относятся ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΡ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΡŽ строки apply 'com.android.library'.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° ΠΈΠ· Ρ„Π°ΠΉΠ»Π° build.gradle, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ обфускации:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.2"
    defaultConfig {
        ...
    }

    buildTypes {
        release {
            minifyEnabled true
            ...
        }
    }
}

dependencies {
  ...
}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° build.gradle для Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉ Ρ‚Π°ΠΊΠΎΠΉ настройки:

apply plugin: 'android-library'

dependencies {
  compile 'com.android.support:support-v4:18.0.+'
}

android {
  compileSdkVersion 14
  buildToolsVersion '17.0.0'
  ...
}

И ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ для Checkmarx:

ProGuardObfuscationNotInUse

// Поиск ΠΌΠ΅Ρ‚ΠΎΠ΄Π° release срСди всСх ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² Gradle Ρ„Π°ΠΉΠ»Π°Ρ…
CxList releaseMethod = Find_Gradle_Method("release");

// ВсС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ² build.gradle
CxList gradleBuildObjects = Find_Gradle_Build_Objects();

// Поиск Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ находится Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° "release" срСди всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ² build.gradle
CxList methodInvokesUnderRelease = gradleBuildObjects.FindByType(typeof(MethodInvokeExpr)).GetByAncs(releaseMethod);

// Π˜Ρ‰Π΅ΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ gradle-Ρ„Π°ΠΉΠ»ΠΎΠ² строку "com.android.library" - это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» относится ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΠΈ Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· ΠΏΡ€Π°Π²ΠΈΠ»Π°
CxList android_library = gradleBuildObjects.FindByName("com.android.library");

// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ пустого массива
List<string> libraries_path = new List<string> {};

// ΠŸΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ Ρ‡Π΅Ρ€Π΅Π· всС Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Π΅ "Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅" Ρ„Π°ΠΉΠ»Ρ‹
foreach(CxList library in android_library)
{
    // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ
	string file_name_library = library.GetFirstGraph().LinePragma.FileName;
    
    // ДобавляСм Π΅Π³ΠΎ Π² наш массив
	libraries_path.Add(file_name_library);
}

// Π˜Ρ‰Π΅ΠΌ всС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ обфускации Π² Ρ€Π΅Π»ΠΈΠ·Π½Ρ‹Ρ… настройках
CxList minifyEnabled = methodInvokesUnderRelease.FindByShortName("minifyEnabled");

// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ этих Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²
CxList minifyValue = gradleBuildObjects.GetParameters(minifyEnabled, 0);

// Π˜Ρ‰Π΅ΠΌ срСди Π½ΠΈΡ… Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅
CxList minifyValueTrue = minifyValue.FindByShortName("true");

// НСмного ΠΌΠ°Π³ΠΈΠΈ, Ссли Π½Π΅ нашли стандартным способом :D
if (minifyValueTrue.Count == 0) {
	minifyValue = minifyValue.FindByAbstractValue(abstractValue => abstractValue is TrueAbstractValue);
} else {
    // А Ссли всё-Ρ‚Π°ΠΊΠΈ нашли, Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈ оставляСм
	minifyValue = minifyValueTrue;	
}

// Если Π½Π΅ нашлось Ρ‚Π°ΠΊΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²
if (minifyValue.Count == 0)
{
    // Для Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ отобраТСния мСста срабатывания Π² Ρ„Π°ΠΉΠ»Π΅ ΠΈΡ‰Π΅ΠΌ ΠΈΠ»ΠΈ buildTypes ΠΈΠ»ΠΈ android
	CxList tempResult = All.NewCxList();
	CxList buildTypes = Find_Gradle_Method("buildTypes");
	if (buildTypes.Count > 0) {
		tempResult = buildTypes;
	} else {
		tempResult = Find_Gradle_Method("android");
	}
	
	// Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… мСст срабатывания ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ ΠΈ опрСдСляСм, Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ ΠΈΠ»ΠΈ основной Ρ„Π°ΠΉΠ»Ρ‹ сборки
	foreach(CxList res in tempResult)
	{
        // ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ, Π² ΠΊΠ°ΠΊΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ Π±Ρ‹Π» Π½Π°ΠΉΠ΄Π΅Π½ buildType ΠΈΠ»ΠΈ android ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹
		string file_name_result = res.GetFirstGraph().LinePragma.FileName;
        
        // Если Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π½Π΅Ρ‚ Π² нашСм спискС "Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ…" Ρ„Π°ΠΉΠ»ΠΎΠ² - Π·Π½Π°Ρ‡ΠΈΡ‚ это основной Ρ„Π°ΠΉΠ» ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
		if (libraries_path.Contains(file_name_result) == false){
			result.Add(res);
		}
	}
}

Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ достаточно ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ пригодится Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Android ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½ΠΎ ΠΈ для Π΄Ρ€ΡƒΠ³ΠΈΡ… случаСв, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ.

Π—Π°Π΄Π°Ρ‡Π°: Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ стороннСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Ссли синтаксис поддСрТиваСтся Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ

РСшСниС: ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ всСвозмоТных Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² процСссС написания ΠΊΠΎΠ΄Π° просто Π·Π°ΡˆΠΊΠ°Π»ΠΈΠ²Π°Π΅Ρ‚. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Checkmarx Π½Π΅ всСгда Π·Π½Π°Π΅Ρ‚ ΠΎΠ± ΠΈΡ… сущСствовании ΠΈ наша Π·Π°Π΄Π°Ρ‡Π° Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ относятся ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊ этому Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΡƒ. Иногда это ослоТняСтся Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ названия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сильно распространСны ΠΈ нСльзя ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅.

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ синтаксис Ρ‚Π°ΠΊΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π½Π΅ всСгда ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ распознаСтся ΠΈ приходится ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ большоС количСство Π»ΠΎΠΆΠ½Ρ‹Ρ… срабатываний. БущСствуСт нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ сканирования ΠΈ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΠΎΡΡ‚Π°Π²Π»Π΅Π½Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ:

  • ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΌΡ‹ Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Но Π² случаС, Ссли ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ€Π΅ΡˆΠΈΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ нСсколько Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ названия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΡ€ΠΈΡΡ‚Π½ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρƒ ΠΈΠ· многочислСнных Π»ΠΎΠΆΠ½Ρ‹Ρ… срабатываний

  • Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ поиск ΠΏΠΎ Ρ„Π°ΠΉΠ»Π°ΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… явно происходит ΠΈΠΌΠΏΠΎΡ€Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΌΡ‹ смоТСм Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌΠΈ, Ρ‡Ρ‚ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ примСняСтся нуТная Π½Π°ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°

  • И Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, это использованиС Π΄Π²ΡƒΡ… Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ² совмСстно.

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΈΠ·Π²Π΅ΡΡ‚Π½ΡƒΡŽ Π² ΡƒΠ·ΠΊΠΈΡ… ΠΊΡ€ΡƒΠ³Π°Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ slick для языка программирования Scala, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Splicing Literal Values. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС, для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² SQL-запрос Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ $, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ подставляСт Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сформированный SQL-запрос. Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΠΏΠΎ Ρ„Π°ΠΊΡ‚Ρƒ являСтся прямым Π°Π½Π°Π»ΠΎΠ³ΠΎΠΌ Prepared Statement Π² Java. Но, Π² случаС нСобходимости динамичСски ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ SQL-запрос, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ #$, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ подставит Π΄Π°Π½Π½Ρ‹Π΅ Π² запрос (практичСски, ΠΊΠ°ΠΊ конкатСнация строк).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°:

// Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС - значСния, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ
val table = "coffees"
sql"select * from #$table where name = $name".as[Coffee].headOption

Checkmarx ΠΏΠΎΠΊΠ° Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ использованиС Splicing Literal Values ΠΈ пропускаСт ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ #$, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ SQL-ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠΎΠ΄ΡΠ²Π΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ мСста Π² ΠΊΠΎΠ΄Π΅:

// Находим всС ΠΈΠΌΠΏΠΎΡ€Ρ‚Ρ‹
CxList imports = All.FindByType(typeof(Import));

// Π˜Ρ‰Π΅ΠΌ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π² ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°Ρ… slick
CxList slick = imports.FindByShortName("slick");

// НСкоторый Ρ„Π»Π°Π³, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² ΠΊΠΎΠ΄Π΅ присутствуСт
// Для Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ опрСдСлСния - ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ с ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„Π°ΠΉΠ»Π°
bool not_empty_list = false;
foreach (CxList r in slick)
{
    // Если встрСтили ΠΈΠΌΠΏΠΎΡ€Ρ‚, считаСм, Ρ‡Ρ‚ΠΎ slick ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ
	not_empty_list = true;
}

if (not_empty_list) {
    // Π˜Ρ‰Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ пСрСдаСтся SQL-строка
	CxList sql = All.FindByShortName("sql");
	sql.Add(All.FindByShortName("sqlu"));
	
	// ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² эти Π²Ρ‹Π·ΠΎΠ²Ρ‹
	CxList data_sql = All.DataInfluencingOn(sql);
	
	// Π’Π°ΠΊ ΠΊΠ°ΠΊ синтакис Π½Π΅ поддСрТиваСтся, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ с рСгулярными выраТСниями
	// RegExp стоит ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΡ€Π°ΠΉΠ½Π΅ остороТно ΠΈ Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° большом количСствС Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ΅Ρ‚ сильно ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ
	CxList find_possible_inj = data_sql.FindByRegex(@"#$", true, true, true);

    // ИзбавляСмся ΠΎΡ‚ Π»ΠΈΡˆΠ½ΠΈΡ… срабатываний, Ссли ΠΎΠ½ΠΈ Π΅ΡΡ‚ΡŒ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
	result = find_possible_inj.FindByType(typeof(BinaryExpr));
}

Π—Π°Π΄Π°Ρ‡Π°: Поиск ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… уязвимых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Open-Source Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ…

РСшСниС: Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… компаниях ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ инструмСнты для контроля Open-Source (ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° OSA), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ использованиС уязвимых вСрсий Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π² Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… прилоТСниях. Иногда ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π΄ΠΎ бСзопасной вСрсии Π½Π΅ прСдставляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ. Π’ ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ случаях Π΅ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ограничСния, Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… бСзопасной вСрсии ΠΈ вовсС Π½Π΅Ρ‚. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ комбинация ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊ SAST ΠΈ OSA, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ приводят ΠΊ эксплуатации уязвимости, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² ΠΊΠΎΠ΄Π΅.

Но ΠΈΠ½ΠΎΠ³Π΄Π°, особСнно, Ссли Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ JavaScript, это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ совсСм Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ. НиТС прСдставлСно Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ идСальноС, Π½ΠΎ Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π΅, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ уязвимостСй Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅ lodash Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… template ΠΈ *set.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ тСстового ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ уязвимого ΠΊΠΎΠ΄Π° Π² JS Ρ„Π°ΠΉΠ»Π΅:

/**
 * Template example
 */

'use strict';
var _ = require("./node_modules/lodash.js");


// Use the "interpolate" delimiter to create a compiled template.
var compiled = _.template('hello <%= js %>!');
console.log(compiled({ 'js': 'lodash' }));
// => 'hello lodash!'

// Use the internal `print` function in "evaluate" delimiters.

var compiled = _.template('<% print("hello " + js); %>!');
console.log(compiled({ 'js': 'lodash' }));
// => 'hello lodash!'

И ΠΏΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π² html:

<!DOCTYPE html>
<html>
<head>
    <title>Lodash Tutorial</title>
    <script src="./node_modules/lodash.js"></script>
    <script type="text/javascript">
  // Lodash chunking array
        nums = [1, 2, 3, 4, 5, 6, 7, 8, 9];

        let c1 = _.template('<% print("hello " + js); %>!');
        console.log(c1);

        let c2 = _.template('<% print("hello " + js); %>!');
        console.log(c2);
    </script>
</head>
<body></body>
</html>

Π˜Ρ‰Π΅ΠΌ всС наши уязвимыС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ пСрСчислСны Π² уязвимостях:

// Π˜Ρ‰Π΅ΠΌ всС строки: Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… встрСчаСтся строка lodash (ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ это объявлСниС ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
CxList lodash_strings = Find_String_Literal().FindByShortName("*lodash*");

// Π˜Ρ‰Π΅ΠΌ всС Π΄Π°Π½Π½Ρ‹Π΅: ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ с этими строками
CxList data_on_lodash = All.InfluencedBy(lodash_strings);


// Π—Π°Π΄Π°Π΅ΠΌ список уязвимых ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²
List<string> vulnerable_methods = new List<string> {"template", "*set"};

// Π˜Ρ‰Π΅ΠΌ всС наши уязвимыС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ пСрСчислСнны Π² уязвимостях ΠΈ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Ρ‹Π²Π°Π΅ΠΌ ΠΈΡ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π°ΠΌ, Π³Π΄Π΅ ΠΎΠ½ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈΡΡŒ
CxList vulnerableMethods = All.FindByShortNames(vulnerable_methods).FindByType(typeof(MethodInvokeExpr));

//Находим всС Π΄Π°Π½Π½Ρ‹Π΅: ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ
CxList vulnFlow = All.InfluencedBy(vulnerableMethods);

// Если Π΅ΡΡ‚ΡŒ пСрСсСчСниС ΠΏΠΎ этим Π΄Π°Π½Π½Ρ‹ΠΌ - ΠΊΠ»Π°Π΄Π΅ΠΌ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
result = vulnFlow * data_on_lodash;

// Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ список ΠΏΡƒΡ‚Π΅ΠΉ ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΡ‹ ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΡˆΠ»ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ Π² дальнСйшСм Π΄ΡƒΠ±Π»ΠΈ
List<string> lodash_result_path = new List<string> {};

foreach(CxList lodash_result in result)
{
    // ΠžΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Ρ€Π°Π· ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΡƒΡ‚ΠΈ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ
	string file_name = lodash_result.GetFirstGraph().LinePragma.FileName;
	lodash_result_path.Add(file_name);
}

// Π”Π°Π»ΡŒΡˆΠ΅ ΠΈΠ΄Π΅Ρ‚ Ρ‡Π°ΡΡ‚ΡŒ относящаяся ΠΊ html Ρ„Π°ΠΉΠ»Π°ΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Π½ΠΈΡ… ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΊΡƒΠ΄Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΠ΄Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ²
// Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ массив ΠΏΡƒΡ‚Π΅ΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌΠΈ, Ρ‡Ρ‚ΠΎ срабатывания уязвимых ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π±Ρ‹Π»ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² Ρ‚Π΅Ρ… Ρ„Π°ΠΉΠ»Π°Ρ…, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… объявлСн lodash
List<string> lodash_path = new List<string> {};
foreach(CxList string_lodash in lodash_strings)
{
	string file_name = string_lodash.GetFirstGraph().LinePragma.FileName;
	lodash_path.Add(file_name);
}

// ΠŸΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅ΠΌ всС уязвимыС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ убСТдаСмся, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π²Ρ‹Π·Π²Π°Π½Ρ‹ Π² Ρ‚Π΅Ρ… ΠΆΠ΅ Ρ„Π°ΠΉΠ»Π°Ρ…, Ρ‡Ρ‚ΠΎ ΠΈ объявлСниС/Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ lodash
foreach(CxList method in vulnerableMethods)
{
	string file_name_method = method.GetFirstGraph().LinePragma.FileName;
	if (lodash_path.Contains(file_name_method) == true && lodash_result_path.Contains(file_name_method) == false){
		result.Add(method);
	}
}

// Π£Π±ΠΈΡ€Π°Π΅ΠΌ всС UknownReferences ΠΈ оставляСм самый "Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ" ΠΈΠ· ΠΏΡƒΡ‚Π΅ΠΉ, Ссли Ρ‚Π°ΠΊΠΈΠ΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ
result = result.ReduceFlow(CxList.ReduceFlowType.ReduceSmallFlow) - result.FindByType(typeof(UnknownReference));

Π—Π°Π΄Π°Ρ‡Π°: Поиск Π·Π°ΡˆΠΈΡ‚Ρ‹Ρ… Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ сСртификатов

РСшСниС: НСрСдко прилоТСния, особСнно ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ сСртификаты ΠΈΠ»ΠΈ ΠΊΠ»ΡŽΡ‡ΠΈ для доступа ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ сСрвСрам ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ SSL-Pinning. Если ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния бСзопасности — Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ Π² ΠΊΠΎΠ΄Π΅ Π½Π΅ самая Π»ΡƒΡ‡ΡˆΠ°Ρ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ:

// НайдСм всС сСртификаты ΠΏΠΎ маскС Ρ„Π°ΠΉΠ»Π°
CxList find_certs = All.FindByShortNames(new List<string> {"*.der", "*.cer", "*.pem", "*.key"}, false);

// ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Π³Π΄Π΅ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ
CxList data_used_certs = All.DataInfluencedBy(find_certs);

// И для ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ - ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π³Π΄Π΅ вызываСтся Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ сСртификатов
// Для Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹
CxList methods = All.FindByMemberAccess("*.getAssets");

// ΠŸΠ΅Ρ€Π΅ΡΠ΅Ρ‡Π΅Π½ΠΈΠ΅ мноТСств даст Π½Π°ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠΎ использованию Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… сСртификатов Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ
result = methods * data_used_certs;

Π—Π°Π΄Π°Ρ‡Π°: Поиск скомпромСтированных Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ

РСшСниС: НСрСдко приходится ΠΎΡ‚Π·Ρ‹Π²Π°Ρ‚ΡŒ скомпромСнтированныС Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π²Π°ΠΆΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, которая присутствуСт Π² ΠΊΠΎΠ΄Π΅. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡ… Π²Π½ΡƒΡ‚Ρ€ΠΈ исходников Π½Π΅ самая Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ идСя, Π½ΠΎ ситуации Π±Ρ‹Π²Π°ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅. Благодаря запросам CxQL Π½Π°ΠΉΡ‚ΠΈ Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ достаточно просто:

// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ всС строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТатся Π² ΠΊΠΎΠ΄Π΅
CxList strings = base.Find_Strings();

// Π˜Ρ‰Π΅ΠΌ срСди всСх строк Π½ΡƒΠΆΠ½ΠΎΠ΅ Π½Π°ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠΊΠ΅Π½ Π² Π²ΠΈΠ΄Π΅ строки "qwerty12345"
result = strings.FindByShortName("qwerty12345");

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

НадСюсь, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΌ, ΠΊΡ‚ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ своё знакомство с инструмСнтом Checkmarx Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½Π° данная ΡΡ‚Π°Ρ‚ΡŒΡ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Ρ‚Π΅, ΠΊΡ‚ΠΎ ΡƒΠΆΠ΅ Π΄Π°Π²Π½ΠΎ ΠΏΠΈΡˆΠ΅Ρ‚ свои ΠΏΡ€Π°Π²ΠΈΠ»Π°, Ρ‚ΠΎΠΆΠ΅ Π½Π°ΠΉΠ΄ΡƒΡ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ Π² этом руководствС.

К соТалСнию, сСйчас ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ рСсурса, Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΡ‡Π΅Ρ€ΠΏΠ½ΡƒΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΈΠ΄Π΅ΠΈ Π² Ρ…ΠΎΠ΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€Π°Π²ΠΈΠ» для Checkmarx. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ создали Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π½Π° Github, Π³Π΄Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹ΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ свои Π½Π°Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ, ΠΊΡ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ CxQL, смог Π½Π°ΠΉΡ‚ΠΈ Π² Π½Π΅ΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π» Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ с сообщСством своими Ρ‚Ρ€ΡƒΠ΄Π°ΠΌΠΈ. Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π² процСссС наполнСния ΠΈ структурирования ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ contributors are welcome!

Бпасибо за вниманиС!

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com