Ħ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.
Ħ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:
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.
-
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.
Twaqqif ta' Preset fl-interface Checkmarx
-
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.
CxAudit interface
-
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.
Id-diviżjoni tar-regoli bil-lingwa
-
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).
Id-determinazzjoni tat-tip ta 'regola meta toħloq
-
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.
Eżempju ta' regola ġdida fl-interface tal-Maniġer tas-Sett minn qabel
-
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.
-
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
Id-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 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 $
, 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
Grazzi tal-attenzjoni tiegħek!
Sors: www.habr.com