Kif tikteb regoli għal Checkmarx mingħajr ma tiġnun

Ħej Habr!

Fix-xogħol tagħna, il-kumpanija tagħna ħafna drabi tittratta diversi għodod ta 'analiżi tal-kodiċi statiku (SAST). Barra mill-kaxxa kollha jaħdmu medja. Naturalment, kollox jiddependi fuq il-proġett u t-teknoloġiji użati fih, kif ukoll kemm dawn it-teknoloġiji huma koperti mir-regoli ta 'analiżi. Fl-opinjoni tiegħi, wieħed mill-aktar kriterji importanti meta tagħżel għodda SAST hija l-abbiltà li tippersonalizzaha skont l-ispeċifiċitajiet tal-applikazzjonijiet tiegħek, jiġifieri, tikteb u tibdel ir-regoli tal-analiżi jew, kif jissejħu aktar spiss, Custom Queries.

Kif tikteb regoli għal Checkmarx mingħajr ma tiġnun

Ħafna drabi nużaw Checkmarx - analizzatur tal-kodiċi interessanti u qawwi ħafna. F'dan l-artikolu ser nitkellem dwar l-esperjenza tiegħi tal-kitba ta 'regoli ta' analiżi għaliha.

Tabella tal-kontenut

Dħul

Biex tibda, nixtieq nirrakkomanda wieħed mill-ftit artikli bir-Russu dwar il-karatteristiċi tal-kitba ta 'mistoqsijiet għal Checkmarx. Ġie ppubblikat fuq Habré fl-aħħar tal-2019 taħt it-titlu: "Hello, Checkmarx!" Kif tikteb mistoqsija Checkmarx SAST u ssib vulnerabbiltajiet friski.

Teżamina fid-dettall kif tikteb l-ewwel mistoqsijiet f'CxQL (Checkmarx Query Language) għal xi applikazzjoni tat-test u turi l-prinċipji bażiċi ta 'kif jaħdmu r-regoli tal-analiżi.

Mhux se nirrepeti dak deskritt fih, għalkemm xi intersezzjonijiet xorta se jkunu preżenti. Fl-artiklu tiegħi se nipprova niġbor tip ta '"ġbir ta' riċetti", lista ta 'soluzzjonijiet għal problemi speċifiċi li ltqajt magħhom waqt ix-xogħol tiegħi ma' Checkmarx. Kelli nagħmel moħħi fuq ħafna minn dawn il-problemi. Xi drabi ma kienx hemm biżżejjed informazzjoni fid-dokumentazzjoni, u xi drabi kien saħansitra diffiċli li tifhem kif tagħmel dak li kien meħtieġ. Nittama li l-esperjenza tiegħi u l-iljieli bla rqad ma jkunux għalxejn, u din il-"ġabra ta 'riċetti Custom Queries" tiffranka ftit sigħat jew ftit ċelloli tan-nervituri. Allura, ejja nibdew!

Informazzjoni ġenerali dwar ir-regoli

L-ewwel, ejja nħarsu lejn ftit kunċetti bażiċi u l-proċess ta 'ħidma mar-regoli, għal fehim aħjar ta' x'se jiġri wara. U wkoll għax id-dokumentazzjoni ma tgħid xejn dwar dan jew hija mifruxa ħafna fl-istruttura, li mhix konvenjenti ħafna.

  1. Ir-regoli huma applikati waqt l-iskannjar skont is-sett minn qabel magħżul fil-bidu (sett ta 'regoli attivi). Tista 'toħloq numru illimitat ta' presets, u eżattament kif tistrutturahom jiddependi fuq l-ispeċifiċitajiet tal-proċess tiegħek. Tista' tiġborhom skont il-lingwa jew tagħżel presets għal kull proġett. In-numru ta 'regoli attivi jaffettwa l-veloċità u l-eżattezza tal-iskannjar.

    Kif tikteb regoli għal Checkmarx mingħajr ma tiġnunTwaqqif ta' Preset fl-interface Checkmarx

  2. Ir-regoli huma editjati f'għodda speċjali msejħa CxAuditor. Din hija applikazzjoni tad-desktop li tikkonnettja ma' server li jħaddem Checkmarx. Din l-għodda għandha żewġ modi ta 'tħaddim: regoli ta' editjar u analiżi tar-riżultati ta 'skan diġà mwettqa.

    Kif tikteb regoli għal Checkmarx mingħajr ma tiġnunCxAudit interface

  3. Ir-regoli f'Checkmarx huma maqsuma bil-lingwa, jiġifieri, kull lingwa għandha s-sett ta' mistoqsijiet tagħha. Hemm ukoll xi regoli ġenerali li japplikaw irrispettivament mill-lingwa, dawn huma l-hekk imsejħa mistoqsijiet bażiċi. Fil-biċċa l-kbira, il-mistoqsijiet bażiċi jinvolvu t-tfittxija għal informazzjoni li jużaw regoli oħra.

    Kif tikteb regoli għal Checkmarx mingħajr ma tiġnunId-diviżjoni tar-regoli bil-lingwa

  4. Ir-regoli huma "Eżegwibbli" u "Mhux Esegwibbli" (Eżegwiti u Mhux Eżegwiti). Mhux l-isem korrett, fl-opinjoni tiegħi, imma dak hu. L-aħħar linja hija li r-riżultat tal-eżekuzzjoni ta 'regoli "Eżekutibbli" se jintwera fir-riżultati tal-iskannjar fl-UI, u r-regoli "Mhux Esegwibbli" huma meħtieġa biss biex jintużaw ir-riżultati tagħhom f'talbiet oħra (essenzjalment, funzjoni biss).

    Kif tikteb regoli għal Checkmarx mingħajr ma tiġnunId-determinazzjoni tat-tip ta 'regola meta toħloq

  5. Tista' toħloq regoli ġodda jew tissupplimenta/tikteb mill-ġdid dawk eżistenti. Sabiex tikteb regola mill-ġdid, għandek bżonn issibha fis-siġra, ikklikkja bil-lemin u agħżel "Override" mill-menu drop-down. Huwa importanti li tiftakar hawnhekk li r-regoli l-ġodda mhumiex inizjalment inklużi fil-presets u mhumiex attivi. Biex tibda tużahom jeħtieġ li tattivahom fil-menu “Maniġer tas-Sett minn qabel” fl-istrument. Ir-regoli miktuba mill-ġdid iżommu s-settings tagħhom, jiġifieri, jekk ir-regola kienet attiva, tibqa’ hekk u tiġi applikata immedjatament.

    Kif tikteb regoli għal Checkmarx mingħajr ma tiġnunEżempju ta' regola ġdida fl-interface tal-Maniġer tas-Sett minn qabel

  6. Matul l-eżekuzzjoni, tinbena "siġra" ta 'talbiet, li tiddependi fuq xiex. Ir-regoli li jiġbru l-informazzjoni huma eżegwiti l-ewwel, u dawk li jużawha t-tieni. Ir-riżultat tal-eżekuzzjoni huwa cached, għalhekk jekk huwa possibbli li jintużaw ir-riżultati ta 'regola eżistenti, allura huwa aħjar li tagħmel dan, dan inaqqas il-ħin tal-iskannjar.

  7. Ir-regoli jistgħu jiġu applikati f'livelli differenti:

  • Għas-sistema kollha - se tintuża għal kwalunkwe skannjar ta 'kwalunkwe proġett

  • Fil-livell tat-tim (Tim) - se tintuża biss biex tiskennja proġetti fit-tim magħżul.

  • Fil-livell tal-proġett - Se jiġi applikat fi proġett speċifiku

    Kif tikteb regoli għal Checkmarx mingħajr ma tiġnunId-determinazzjoni tal-livell li fih se tiġi applikata r-regola

"Dizzjunarju" għal dawk li jibdew

U ser nibda bi ftit affarijiet li kkawżawli mistoqsijiet, u ser nuri wkoll numru ta 'tekniki li se jissimplifikaw il-ħajja b'mod sinifikanti.

Operazzjonijiet bil-listi

- вычитание одного из другого (list2 - list1)
* пересечение списков (list1 * list2)
+ сложение списков (list1 + list2)

& (логическое И) - объединяет списки по совпадению (list1 & list2), аналогично пересечению (list1 * list2)
| (логическое ИЛИ) - объединяет списки по широкому поиску (list1 | list2)

Со списками не работает:  ^  &&  ||  %  / 

L-oġġetti kollha misjuba

Fi ħdan il-lingwa skennjata, tista 'tikseb lista ta' assolutament l-elementi kollha li Checkmarx identifika (kordi, funzjonijiet, klassijiet, metodi, eċċ.). Dan huwa xi spazju ta 'oġġetti li jistgħu jiġu aċċessati permezz All. Jiġifieri, biex tfittex oġġett b'isem speċifiku searchMe, tista' tfittex, pereżempju, bl-isem fl-oġġetti kollha misjuba:

// Такой запрос выдаст все элементы
result = All;

// Такой запрос выдаст все элементы, в имени которых присутствует “searchMe“
result = All.FindByName("searchMe");

Iżda, jekk għandek bżonn tfittex f'lingwa oħra li għal xi raġuni ma kinitx inkluża fl-iskan (per eżempju, groovy fi proġett Android), tista 'tespandi l-ispazju tal-oġġett tagħna permezz ta' varjabbli:

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

Funzjonijiet għall-analiżi tal-Fluss

Dawn il-funzjonijiet jintużaw f'ħafna regoli u hawn ftit cheat sheet ta 'dak li jfissru:

// Какие данные second влияют на first.
// Другими словами - ТО (second) что влияет на  МЕНЯ (first).
result = first.DataInfluencedBy(second);

// Какие данные first влияют на second.
// Другими словами - Я (first) влияю на ТО (second).
result = first.DataInfluencingOn(second);

Jkollna isem/mogħdija tal-fajl

Hemm diversi attributi li jistgħu jinkisbu mir-riżultati ta 'mistoqsija (l-isem tal-fajl li fih instabet id-dħul, string, eċċ.), iżda d-dokumentazzjoni ma tgħidx kif tikseb u tużahom. Allura, sabiex tagħmel dan, trid taċċessa l-proprjetà LinePragma u l-oġġetti li għandna bżonn ikunu jinsabu ġewwa fiha:

// Для примера найдем все методы
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);

Ta’ min iżomm f’moħħu li FileName fih fil-fatt it-triq għall-fajl, peress li użajna l-metodu GetFirstGraph.

Riżultat ta' eżekuzzjoni

Hemm varjabbli speċjali ġewwa CxQL result, li jirritorna r-riżultat tal-eżekuzzjoni tar-regola bil-miktub tiegħek. Huwa inizjalizzat immedjatament u tista 'tikteb riżultati intermedji fiha, tbiddel u tirfinahom kif taħdem. Iżda, jekk ma jkunx hemm assenjazzjoni għal din il-varjabbli jew funzjoni ġewwa r-regola return— ir-riżultat tal-eżekuzzjoni dejjem ikun żero.

Il-mistoqsija li ġejja ma tirritorna xejn lilna bħala riżultat tal-eżekuzzjoni u dejjem tkun vojta:

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

Iżda, wara li assenjat ir-riżultat tal-eżekuzzjoni lir-riżultat varjabbli maġiku, se naraw x'jirritorna lilna din is-sejħa:

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

// Выводим, как результат выполнения правила
result = libraries

// Или еще короче
result = All.FindByName("foo");

Jużaw ir-riżultati ta 'regoli oħra

Ir-regoli f'Checkmarx jistgħu jissejħu analogi għal funzjonijiet f'lingwa ta' programmar regolari. Meta tikteb regola, tista' tuża r-riżultati ta' mistoqsijiet oħra. Pereżempju, m'hemmx bżonn li tfittex is-sejħiet kollha tal-metodu fil-kodiċi kull darba, sempliċement sejjaħ ir-regola mixtieqa:

// Получаем результат выполнения другого правила
CxList methods = Find_Methods();

// Ищем внутри метод foo. 
// Второй параметр false означает, что ищем без чувствительности к регистру
result = methods.FindByShortName("foo", false);

Dan l-approċċ jippermettilek tqassar il-kodiċi u tnaqqas b'mod sinifikanti l-ħin tal-eżekuzzjoni tar-regola.

Soluzzjoni ta 'problemi

Logging

Meta taħdem bl-għodda, xi drabi mhux possibbli li tikteb immedjatament il-mistoqsija mixtieqa u trid tesperimenta, tipprova għażliet differenti. Għal każ bħal dan, l-għodda tipprovdi logging, li jissejjaħ kif ġej:

// Находим что-то
CxList toLog = All.FindByShortName("log");

// Формируем строку и отправляем в лог
cxLog.WriteDebugMessage (“number of DOM elements =” + All.Count);

Iżda ta 'min jiftakar li dan il-metodu jaċċetta biss bħala input spag, għalhekk mhux se jkun possibbli li tintwera lista sħiħa ta 'elementi misjuba bħala riżultat tal-ewwel operazzjoni. It-tieni għażla, li tintuża għad-debugging, hija li tassenja lil varjabbli maġiku minn żmien għal żmien result ir-riżultat tal-mistoqsija u ara x'jiġri. Dan l-approċċ mhuwiex konvenjenti ħafna; trid tkun ċert li m'hemm l-ebda overrides jew operazzjonijiet b'dan fil-kodiċi wara result jew sempliċement tikkummenta l-kodiċi hawn taħt. Jew tista', bħali, tinsa tneħħi diversi sejħiet bħal dawn minn regola lesta u tistaqsi għaliex xejn ma jaħdem.

Mod aktar konvenjenti huwa li ssejjaħ il-metodu return bil-parametru meħtieġ. F'dan il-każ, l-eżekuzzjoni tar-regola se tintemm u nkunu nistgħu naraw x'ġara bħala riżultat ta 'dak li ktibna:

// Находим что-то
CxList toLog = All.FindByShortName("log");

// Выводим результат выполнения
return toLog

//Все, что написано дальше не будет выполнено
result = All.DataInfluencedBy(toLog)

Problema ta' login

Hemm sitwazzjonijiet meta ma tistax taċċessa l-għodda CxAudit (li tintuża biex tikteb ir-regoli). Jista 'jkun hemm ħafna raġunijiet għal dan, inklużi ħabtiet, aġġornamenti f'daqqa tal-Windows, BSOD u sitwazzjonijiet oħra mhux previsti li huma lil hinn mill-kontroll tagħna. F'dan il-każ, xi drabi jkun hemm sessjoni mhux mitmuma fid-database, li ma tħallikx tidħol mill-ġdid. Biex tirranġaha, trid tmexxi diversi mistoqsijiet:

Għal Checkmarx qabel 8.6:

// Проверяем, что есть залогиненые пользователи, выполнив запрос в БД
SELECT COUNT(*) FROM [CxDB].[dbo].LoggedinUser WHERE [ClientType] = 6;
 
// Если что-то есть, а на самом деле даже если и нет, попробовать выполнить запрос
DELETE FROM [CxDB].[dbo].LoggedinUser WHERE [ClientType] = 6;

Għal Checkmarx wara 8.6:

// Проверяем, что есть залогиненые пользователи, выполнив запрос в БД
SELECT COUNT(*) FROM LoggedinUser WHERE (ClientType = 'Audit');
 
// Если что-то есть, а на самом деле даже если и нет, попробовать выполнить запрос
DELETE FROM [CxDB].[dbo].LoggedinUser WHERE (ClientType = 'Audit');

Regoli tal-kitba

Issa naslu għall-aktar parti interessanti. Meta tibda tikteb regoli f'CxQL, dak li ħafna drabi jonqoskom mhux daqshekk dokumentazzjoni daqs xi eżempji ħajjin ta 'soluzzjoni ta' ċerti problemi u tiddeskrivi l-proċess ta 'operazzjoni ta' mistoqsija b'mod ġenerali.

Se nipprova nagħmel il-ħajja ftit aktar faċli għal dawk li qed jibdew jgħoddsu fil-lingwa tal-mistoqsijiet u nagħti diversi eżempji ta 'użu ta' Custom Queries biex issolvi ċerti problemi. Xi wħud minnhom huma pjuttost ġenerali u jistgħu jintużaw fil-kumpanija tiegħek prattikament mingħajr bidliet, oħrajn huma aktar speċifiċi, iżda jistgħu jintużaw ukoll billi jinbidel il-kodiċi biex jaqbel mal-ispeċifiċitajiet tal-applikazzjonijiet tiegħek.

Allura, hawn huma l-problemi li ltqajna magħhom l-aktar spiss:

Kompitu: Hemm diversi Flussi fir-riżultati tal-eżekuzzjoni tar-regola u wieħed minnhom huwa nesting ta 'ieħor, trid tħalli waħda minnhom.

soluzzjoni: Tabilħaqq, kultant Checkmarx juri diversi flussi ta' dejta li jistgħu jikkoinċidu u jkunu verżjoni mqassra ta' oħrajn. Hemm metodu speċjali għal każijiet bħal dawn ReduceFlow. Skont il-parametru, se tagħżel l-iqsar jew l-itwal Flow:

// Оставить только длинные Flow
result = result.ReduceFlow(CxList.ReduceFlowType.ReduceSmallFlow);

// Оставить только короткие Flow
result = result.ReduceFlow(CxList.ReduceFlowType.ReduceBigFlow);

Kompitu: Tespandi l-lista ta 'dejta sensittiva li għaliha tirreaġixxi l-għodda

soluzzjoni: Checkmarx għandu regoli bażiċi, li r-riżultati tagħhom jintużaw minn ħafna mistoqsijiet oħra. Billi tissupplimenta xi wħud minn dawn ir-regoli b'dejta speċifika għall-applikazzjoni tiegħek, tista' ttejjeb immedjatament ir-riżultati tal-iskannjar tiegħek. Hawn taħt hawn regola eżempju biex tibda:

General_privacy_violation_list

Ejja nżidu diversi varjabbli li jintużaw fl-applikazzjoni tagħna biex taħżen informazzjoni sensittiva:

// Получаем результат выполнения базового правила
result = base.General_privacy_violation_list();

// Ищем элементы, которые попадают под простые регулярные выражения. Можно дополнить характерными для вас паттернами.
CxList personalList = All.FindByShortNames(new List<string> {
	"*securityToken*", "*sessionId*"}, false);

// Добавляем к конечному результату
result.Add(personalList);

Kompitu: Tespandi l-lista ta 'varjabbli bil-passwords

soluzzjoni: Nirrakkomanda immedjatament li tingħata attenzjoni għar-regola bażika għad-definizzjoni tal-passwords fil-kodiċi u żżid magħha lista ta 'ismijiet varjabbli li huma komunement użati fil-kumpanija tiegħek.

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);
	}
}

Kompitu: Żid oqfsa użati li mhumiex appoġġjati minn Checkmarx

soluzzjoni: Il-mistoqsijiet kollha f'Checkmarx huma maqsuma bil-lingwa, għalhekk trid iżżid regoli għal kull lingwa. Hawn taħt hemm xi eżempji ta 'regoli bħal dawn.

Jekk jintużaw libreriji li jikkumplimentaw jew jissostitwixxu l-funzjonalità standard, jistgħu jiġu miżjuda faċilment mar-regola bażika. Imbagħad kull min jużah jitgħallem immedjatament dwar l-introduzzjonijiet il-ġodda. Bħala eżempju, libreriji għall-illoggjar fl-Android huma Timber u Loggi. Fil-pakkett bażiku, m'hemm l-ebda regoli għall-identifikazzjoni ta 'sejħiet mhux tas-sistema, għalhekk jekk password jew identifikatur tas-sessjoni tidħol fil-log, ma nkunux nafu biha. Ejja nippruvaw inżidu definizzjonijiet ta' metodi bħal dawn mar-regoli Checkmarx.

Eżempju tal-kodiċi tat-test li juża l-librerija Timber għall-illoggjar:

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");
    }
}

U hawnhekk huwa eżempju ta 'talba għal Checkmarx, li jippermettilek iżżid definizzjoni ta' sejħa ta 'metodi Timber bħala punt ta' ħruġ għad-dejta mill-applikazzjoni:

FindAndroidOutputs

// Получаем результат выполнения базового правила
result = base.Find_Android_Outputs();

// Дополняем вызовами, которые приходят из библиотеки Timber
CxList timber = All.FindByExactMemberAccess("Timber.*") +
    All.FindByShortName("Timber").GetMembersOfTarget();

// Добавляем к конечному результату
result.Add(timber);

U tista 'wkoll iżżid mar-regola tal-ġirien, iżda din tirrelata direttament mal-illoggjar fl-Android:

FindAndroidLog_Outputs

// Получаем результат выполнения базового правила
result = base.Find_Android_Log_Outputs();

// Дополняем вызовами, которые приходят из библиотеки Timber
result.Add(
  All.FindByExactMemberAccess("Timber.*") +
  All.FindByShortName("Timber").GetMembersOfTarget()
);

Ukoll, jekk l-applikazzjonijiet Android jużaw WorkManager għal xogħol mhux sinkroniku, hija idea tajba li tinforma wkoll lil Checkmarx dwar dan billi żżid metodu biex tinkiseb data mill-kompitu getInputData:

SibAndroidAqra

// Получаем результат выполнения базового правила
result = base.Find_Android_Read();

// Дополняем вызовом функции getInputData, которая используется в WorkManager
CxList getInputData = All.FindByShortName("getInputData");

// Добавляем к конечному результату
result.Add(getInputData.GetMembersOfTarget());

Kompitu: Tiftix għal data sensittiva fil-plist għal proġetti iOS

soluzzjoni: iOS spiss juża fajls speċjali bl-estensjoni .plist biex jaħżen diversi varjabbli u valuri. Il-ħażna ta 'passwords, tokens, ċwievet u data sensittiva oħra f'dawn il-fajls mhux rakkomandat, peress li jistgħu jiġu estratti mill-apparat mingħajr problemi.

Il-fajls Plist għandhom karatteristiċi li mhumiex ovvji għall-għajn, iżda huma importanti għal Checkmarx. Ejja niktbu regola li tfittex id-data li neħtieġu u tgħidilna jekk il-passwords jew it-tokens jissemmewx xi mkien.

Eżempju ta' fajl bħal dan, li fih token għall-komunikazzjoni mas-servizz 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>

U regola għal Checkmarx, li għandha diversi sfumaturi li għandhom jitqiesu meta tikteb:

// Используем результат выполнения правила по поиску файлов 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);

Kompitu: Tfittxija ta 'informazzjoni fl-XML

soluzzjoni: Checkmarx għandu funzjonijiet konvenjenti ħafna biex jaħdem bl-XML u jfittex valuri, tikketti, attributi u aktar. Iżda, sfortunatament, kien hemm żball fid-dokumentazzjoni li minħabba fih ebda eżempju wieħed ma jaħdem. Minkejja l-fatt li dan id-difett ġie eliminat fl-aħħar verżjoni tad-dokumentazzjoni, oqgħod attent jekk tuża verżjonijiet preċedenti tad-dokumenti.

Hawn eżempju żbaljat mid-dokumentazzjoni:

// Код работать не будет
result = All.FindXmlAttributesByNameAndValue("*.app", 8, “id”, "error- section", false, true);

Bħala riżultat tal-attentat ta 'eżekuzzjoni, se nirċievu żball li All m'hemm l-ebda metodu bħal dan... U dan huwa minnu, peress li hemm spazju speċjali u separat għall-oġġetti għall-użu ta 'funzjonijiet biex taħdem ma' XML - cxXPath. Dan huwa kif tidher il-mistoqsija korretta biex issib setting f'Android li jippermetti l-użu tat-traffiku HTTP:

// Правильный вариант с использованием cxXPath
result = cxXPath.FindXmlAttributesByNameAndValue("*.xml", 8, "cleartextTrafficPermitted", "true", false, true);

Ejja nħarsu lejha fi ftit aktar dettall, peress li s-sintassi għall-funzjonijiet kollha hija simili, wara li tkun dehret waħda, allura għandek bżonn biss tagħżel dik li għandek bżonn. Allura, sekwenzjali skont il-parametri:

  • "*.xml"— maskra tal-fajls li jridu jiġu mfittxija

  • 8 — id tal-lingwa li għaliha hija applikata r-regola

  • "cleartextTrafficPermitted"— isem attribut f'xml

  • "true" — il-valur ta' dan l-attribut

  • false — l-użu ta' espressjoni regolari waqt it-tiftix

  • true — tfisser li t-tfittxija se titwettaq billi jinjora l-każ, jiġifieri, ma jkunx sensittiv għall-każ

Bħala eżempju, użajna regola li tidentifika skorretti, mil-lat tas-sigurtà, settings tal-konnessjoni tan-netwerk f'Android li jippermettu komunikazzjoni mas-server permezz tal-protokoll HTTP. Eżempju ta' setting li fih attribut cleartextTrafficPermitted b'tifsira 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>

Kompitu: Illimita r-riżultati bl-isem/mogħdija tal-fajl

soluzzjoni: F'wieħed mill-proġetti kbar relatati mal-iżvilupp ta 'applikazzjoni mobbli għal Android, iltqajna ma' pożittivi foloz tar-regola li tiddetermina l-issettjar tal-obfuscation. Il-fatt hu li r-regola barra mill-kaxxa tfittxijiet fil-fajl build.gradle setting responsabbli għall-applikazzjoni tar-regoli ta' offuskazzjoni għall-verżjoni tar-rilaxx tal-applikazzjoni.

Iżda fi proġetti kbar kultant ikun hemm fajls tat-tfal build.gradle, li jirreferu għal-libreriji inklużi fil-proġett. Il-partikolarità hija li anki jekk dawn il-fajls ma jindikawx il-ħtieġa għal offuskazzjoni, is-settings tal-fajl tal-assemblaġġ ġenitur se jiġu applikati waqt il-kumpilazzjoni.

Għalhekk, il-kompitu huwa li jinqata' triggers f'fajls tfal li jappartjenu għal libreriji. Jistgħu jiġu identifikati bil-preżenza tal-linja apply 'com.android.library'.

Eżempju ta' kodiċi mill-fajl build.gradle, li tiddetermina l-ħtieġa għal offuskazzjoni:

apply plugin: 'com.android.application'

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

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

dependencies {
  ...
}

Fajl ta' eżempju build.gradle għal librerija inkluża fil-proġett li m'għandhiex din is-setting:

apply plugin: 'android-library'

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

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

U r-regola għal 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);
		}
	}
}

Dan l-approċċ jista 'jkun pjuttost universali u utli mhux biss għall-applikazzjonijiet Android, iżda wkoll għal każijiet oħra meta għandek bżonn tiddetermina jekk riżultat jappartjenix għal fajl speċifiku.

Kompitu: Żid appoġġ għal librerija ta 'parti terza jekk is-sintassi ma tkunx appoġġjata bis-sħiħ

soluzzjoni: In-numru ta 'diversi oqfsa li jintużaw fil-proċess tal-kitba tal-kodiċi huwa sempliċement barra mill-mapep. Naturalment, Checkmarx mhux dejjem jaf dwar l-eżistenza tagħhom, u l-kompitu tagħna huwa li ngħallmuha tifhem li ċerti metodi jappartjenu speċifikament għal dan il-qafas. Xi drabi dan huwa kkumplikat mill-fatt li l-oqfsa jużaw ismijiet ta 'funzjonijiet li huma komuni ħafna u huwa impossibbli li tiddetermina mingħajr ambigwità r-relazzjoni ta' sejħa partikolari għal librerija speċifika.

Id-diffikultà hija li s-sintassi ta’ libreriji bħal dawn mhux dejjem tiġi rikonoxxuta b’mod korrett u trid tesperimenta biex tevita li tikseb numru kbir ta’ pożittivi foloz. Hemm diversi għażliet biex itejbu l-eżattezza tal-iskannjar u ssolvi l-problema:

  • L-ewwel għażla, nafu żgur li l-librerija tintuża fi proġett speċifiku u tista 'tapplika r-regola fil-livell tat-tim. Imma jekk it-tim jiddeċiedi li jieħu approċċ differenti jew juża diversi libreriji li fihom l-ismijiet tal-funzjonijiet jikkoinċidu, nistgħu nġibu stampa mhux pjaċevoli ħafna ta’ bosta pożittivi foloz

  • It-tieni għażla hija li tfittex fajls li fihom il-librerija hija importata b'mod ċar. B'dan l-approċċ, nistgħu nkunu ċerti li l-librerija li għandna bżonn tintuża eżattament f'dan il-fajl.

  • U t-tielet għażla hija li tuża ż-żewġ approċċi ta 'hawn fuq flimkien.

Bħala eżempju, ejja nħarsu lejn librerija magħrufa sew f'ċrieki dojoq roqgħa għal-lingwa ta 'programmar Scala, jiġifieri, il-funzjonalità Splicing Valuri Litterali. B'mod ġenerali, biex tgħaddi parametri għal mistoqsija SQL, trid tuża l-operatur $, li jissostitwixxi d-data f'mistoqsija SQL preformata. Jiġifieri, fil-fatt, huwa analogu dirett ta 'Prepared Statement in Java. Iżda, jekk għandek bżonn tibni dinamikament mistoqsija SQL, per eżempju, jekk għandek bżonn tgħaddi l-ismijiet tat-tabelli, tista 'tuża l-operatur #$, li se jissostitwixxi direttament id-dejta fil-mistoqsija (kważi bħal konkatenazzjoni ta 'string).

Eżempju ta' kodiċi:

// В общем случае - значения, контролируемые пользователем
val table = "coffees"
sql"select * from #$table where name = $name".as[Coffee].headOption

Checkmarx għadu ma jafx kif jiskopri l-użu ta 'Splicing Literal Values ​​​​u skips operaturi #$, Mela ejja nippruvaw ngħallmuha tidentifika injezzjonijiet SQL potenzjali u tenfasizza l-postijiet it-tajba fil-kodiċi:

// Находим все импорты
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));
}

Kompitu: Fittex għal funzjonijiet vulnerabbli użati fil-libreriji Open-Source

soluzzjoni: Ħafna kumpaniji jużaw għodod ta 'monitoraġġ Open-Source (prattika OSA) biex jiskopru l-użu ta' verżjonijiet vulnerabbli ta 'libreriji f'applikazzjonijiet żviluppati. Xi drabi ma jkunx possibbli li taġġorna tali librerija għal verżjoni sigura. F'xi każijiet hemm limitazzjonijiet funzjonali, f'oħrajn m'hemm l-ebda verżjoni sigura. F'dan il-każ, taħlita ta' prattiki SAST u OSA tgħin biex tiddetermina li l-funzjonijiet li jwasslu għall-isfruttament tal-vulnerabbiltà ma jintużawx fil-kodiċi.

Imma xi drabi, speċjalment meta tikkunsidra JavaScript, dan jista 'ma jkunx kompitu kompletament trivjali. Hawn taħt hemm soluzzjoni, forsi mhux ideali, iżda madankollu taħdem, bl-użu tal-eżempju ta 'vulnerabbiltajiet fil-komponent lodash fil-metodi template и *set.

Eżempji ta' test ta' kodiċi potenzjalment vulnerabbli f'fajl 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!'

U meta tikkonnettja direttament f'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>

Qegħdin infittxu l-metodi vulnerabbli kollha tagħna, li huma elenkati fil-vulnerabbiltajiet:

// Ищем все строки: в которых встречается строка 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));

Kompitu: Tiftix għal ċertifikati inkorporati fl-applikazzjoni

soluzzjoni: Mhux rari li applikazzjonijiet, speċjalment dawk mobbli, jużaw ċertifikati jew ċwievet biex jaċċessaw diversi servers jew jivverifikaw SSL-Pinning. Mill-perspettiva tas-sigurtà, il-ħażna ta 'affarijiet bħal dawn fil-kodiċi mhijiex l-aħjar prattika. Ejja nippruvaw niktbu regola li tfittex fajls simili fir-repożitorju:

// Найдем все сертификаты по маске файла
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;

Kompitu: Tfittxija tokens kompromessi fl-applikazzjoni

soluzzjoni: Ħafna drabi huwa meħtieġ li jiġu revokati tokens kompromessi jew informazzjoni importanti oħra li hija preżenti fil-kodiċi. Naturalment, il-ħażna tagħhom ġewwa l-kodiċi tas-sors mhix idea tajba, iżda s-sitwazzjonijiet ivarjaw. Grazzi għall-mistoqsijiet CxQL, li ssib affarijiet bħal dawn huwa pjuttost faċli:

// Получаем все строки, которые содержатся в коде
CxList strings = base.Find_Strings();

// Ищем среди всех строк нужное нам значение. В примере токен в виде строки "qwerty12345"
result = strings.FindByShortName("qwerty12345");

Konklużjoni

Nittama li dan l-artikolu jkun utli għal dawk li qed jibdew il-familjarità tagħhom mal-għodda Checkmarx. Forsi dawk li ilhom jiktbu r-regoli tagħhom stess għal żmien twil isibu wkoll xi ħaġa utli f'din il-gwida.

Sfortunatament, bħalissa hemm nuqqas ta' riżors fejn jistgħu jinġabru ideat ġodda waqt l-iżvilupp tar-regoli għal Checkmarx. Huwa għalhekk li ħloqna repożitorju fuq Github, fejn se npoġġu x-xogħol tagħna biex kull min juża CxQL ikun jista’ jsib xi ħaġa utli fiha, u jkollu wkoll l-opportunità li jaqsam ix-xogħol tiegħu mal-komunità. Ir-repożitorju jinsab fil-proċess li jimla u jistruttura l-kontenut, għalhekk il-kontributuri huma milqugħa!

Grazzi tal-attenzjoni tiegħek!

Sors: www.habr.com

Żid kumment