Ibhalwa njani imithetho yeCheckmarx ngaphandle kokuphambana

Hayi Habr!

Kumsebenzi wethu, inkampani yethu ihlala ijongana nezixhobo ezahlukeneyo zokuhlalutya ikhowudi (SAST). Ngaphandle kwebhokisi bonke basebenza umndilili. Ngokuqinisekileyo, konke kuxhomekeke kwiprojekthi kunye nobuchwepheshe obusetyenziswa kuyo, kunye nendlela obu buchwepheshe buhlanganiswe ngayo nemithetho yokuhlalutya. Ngokombono wam, enye yeyona ndlela ibalulekileyo xa ukhetha isixhobo se-SAST kukukwazi ukwenza ngokwezifiso kwiinkcukacha zezicelo zakho, oko kukuthi, ukubhala kunye nokutshintsha imithetho yokuhlalutya okanye, njengoko zibizwa ngokuphindaphindiweyo, Imibuzo yeSiko.

Ibhalwa njani imithetho yeCheckmarx ngaphandle kokuphambana

Sihlala sisebenzisa i-Checkmarx - isihlalutyi sekhowudi esinomdla kakhulu kwaye sinamandla. Kule nqaku ndiza kuthetha ngamava am okubhala imithetho yokuhlalutya kuyo.

Uluhlu lomxholo

ukungena

Ukuqala, ndingathanda ukucebisa elinye lamanqaku ambalwa ngesiRashiya malunga neempawu zokubhala imibuzo ye-Checkmarx. Yapapashwa kuHabré ekupheleni kuka-2019 phantsi kwesihloko: "Molo, Checkmarx!" Uwubhala njani umbuzo weCheckmarx SAST kwaye ufumane ubuthathaka obupholileyo.

Ihlola ngokweenkcukacha indlela yokubhala imibuzo yokuqala kwi-CxQL (Checkmarx Query Language) kwisicelo esithile sovavanyo kwaye ibonisa imigaqo esisiseko yendlela imithetho yohlalutyo esebenza ngayo.

Andisayi kuphinda le nto ichazwe kuyo, nangona ezinye iindlela zokuhlangana ziseza kubakho. Kwinqaku lam ndiya kuzama ukuqokelela uhlobo "lwengqokelela yeendlela zokupheka", uluhlu lwezisombululo kwiingxaki ezithile endidibana nazo ngexesha lomsebenzi wam kunye neCheckmarx. Kwafuneka ndiphazamise ingqondo yam kwiingxaki ezininzi. Ngamanye amaxesha kwakungekho lwazi lwaneleyo kumaxwebhu, kwaye ngamanye amaxesha kwakunzima ukuqonda indlela yokwenza oko kufunekayo. Ndiyathemba ukuba amava am kunye nobusuku bokungalali abuyi kuba lilize, kwaye le "ngqokelela yeeresiphi zeMibuzo yesiNtu" iya kukugcina iiyure ezimbalwa okanye iiseli zemithambo-luvo. Ngoko, makhe siqale!

Ulwazi ngokubanzi ngemithetho

Okokuqala, makhe sijonge iikhonsepthi ezimbalwa ezisisiseko kunye nenkqubo yokusebenza kunye nemithetho, ukuqonda ngcono oko kuya kwenzeka ngokulandelayo. Kwaye kwakhona ngenxa yokuba amaxwebhu akathethi nto malunga nale nto okanye isasazeke kakhulu kwisakhiwo, esingafanelekanga kakhulu.

  1. Imigaqo isetyenziswa ngexesha lokuskena ngokuxhomekeke kucwangciso olukhethiweyo ekuqaleni (iseti yemithetho esebenzayo). Unokwenza inani elingenamda lokusetwa kwangaphambili, kwaye kanye indlela yokuyilungisa ixhomekeke kwiinkcukacha zenkqubo yakho. Ungamaqela ngolwimi okanye ukhethe useto lwangaphambili lweprojekthi nganye. Inani lemigaqo esebenzayo lichaphazela isantya kunye nokuchaneka kokuskena.

    Ibhalwa njani imithetho yeCheckmarx ngaphandle kokuphambanaUkumisela i-Preset kujongano lwe-Checkmarx

  2. Imigaqo ihlelwa kwisixhobo esikhethekileyo esibizwa ngokuba yiCxAuditor. Esi sisicelo sedesktop esiqhagamshela kumncedisi oqhuba i-Checkmarx. Esi sixhobo sineendlela ezimbini zokusebenza: imithetho yokuhlela kunye nokuhlalutya iziphumo zeskena esele senziwe.

    Ibhalwa njani imithetho yeCheckmarx ngaphandle kokuphambanaUjongano lweCxAudit

  3. Imithetho kwi-Checkmarx yahlulwe ngolwimi, oko kukuthi, ulwimi ngalunye luneseti yalo yemibuzo. Kukwakho nemithetho eqhelekileyo esebenzayo nokuba loluphi ulwimi, le yimibuzo ebizwa ngokuba yimibuzo esisiseko. Ubukhulu becala, imibuzo esisiseko ibandakanya ukukhangela ulwazi olusetyenziswa neminye imithetho.

    Ibhalwa njani imithetho yeCheckmarx ngaphandle kokuphambanaUkwahlula imithetho ngolwimi

  4. Imithetho “Iphunyezwe” kwaye “Ayiphunyezwanga” (Yenziwe kwaye Ayiphunyezwanga). Ayililo igama elichanekileyo, ngokoluvo lwam, kodwa yile nto iyiyo. Eyona nto ibalulekileyo kukuba isiphumo sokuphunyezwa kwemithetho ethi "Executable" iya kuboniswa kwiziphumo zokuskena kwi-UI, kwaye imigaqo ethi "Non-Executable" iyadingeka kuphela ukusebenzisa iziphumo zabo kwezinye izicelo (enyanisweni, ngumsebenzi nje).

    Ibhalwa njani imithetho yeCheckmarx ngaphandle kokuphambanaUkumisela uhlobo lomgaqo xa udala

  5. Unokwenza imithetho emitsha okanye udibanise / ubhale kwakhona ekhoyo. Ukuze uphinde ubhale umgaqo, kufuneka uwufumane emthini, nqakraza ekunene kwaye ukhethe u-"Override" kwimenyu ehlayo. Kubalulekile ukukhumbula apha ukuba imithetho emitsha ayifakwanga ekuqaleni kwi-presets kwaye ayisebenzi. Ukuqala ukuzisebenzisa kufuneka uzivule kwimenyu ethi "Preset Manager" kwisixhobo. Imithetho ebhalwe ngokutsha igcina izicwangciso zayo, oko kukuthi, ukuba umgaqo wawusebenza, uya kuhlala unjalo kwaye uya kusetyenziswa ngokukhawuleza.

    Ibhalwa njani imithetho yeCheckmarx ngaphandle kokuphambanaUmzekelo womgaqo omtsha kwi-Preset Manager interface

  6. Ngethuba lokubulawa, "umthi" wezicelo wakhiwe, oxhomekeke kwintoni. Imithetho eqokelela ulwazi iphunyezwa kuqala, kwaye abo bayisebenzisayo okwesibini. Isiphumo sokwenziwa sigcinwe, ngoko ke ukuba kunokwenzeka ukusebenzisa iziphumo zomgaqo okhoyo, ngoko kungcono ukwenza oko, oku kuya kunciphisa ixesha lokuskena.

  7. Imigaqo ingasetyenziswa kumanqanaba ahlukeneyo:

  • Kuyo yonke inkqubo - iya kusetyenziselwa nakuphi na ukuskena nayiphi na iprojekthi

  • Kwinqanaba leqela (Iqela) - liya kusetyenziswa kuphela ukuskena iiprojekthi kwiqela elikhethiweyo.

  • Kwinqanaba leprojekthi - Iza kusetyenziswa kwiprojekthi ethile

    Ibhalwa njani imithetho yeCheckmarx ngaphandle kokuphambanaUkumisela inqanaba apho umgaqo uya kusetyenziswa

"Isichazi-magama" sabaqalayo

Kwaye ndiza kuqala ngezinto ezimbalwa ezindibangele imibuzo, kwaye ndiza kubonisa inani leendlela eziya kwenza lula ubomi.

Imisebenzi enoluhlu

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

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

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

Zonke izinto ezifunyenweyo

Ngaphakathi kolwimi oluskeniweyo, ungafumana uluhlu lwazo zonke izinto ezichongiweyo nguCheckmarx (imitya, imisebenzi, iiklasi, iindlela, njl. njl.). Esi sesinye isithuba sezinto ezinokufikelelwa ngazo All. Oko kukuthi, ukukhangela into enegama elithile searchMe, ungaphendla, umzekelo, ngegama kuzo zonke izinto ezifunyenweyo:

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

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

Kodwa, ukuba ufuna ukukhangela ngolunye ulwimi, ngenxa yesizathu esithile, akazange afakwe kwi-scan (umzekelo, i-groovy kwiprojekthi ye-Android), unokwandisa indawo yethu yezinto ngokuguquguquka:

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

Imisebenzi yohlalutyo lokuqukuqela

Le misebenzi isetyenziswa kwimithetho emininzi kwaye nali iphepha elincinci lokukopela ukuba lithetha ukuthini:

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

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

Ifumana igama lefayile/umendo

Kukho iimpawu ezininzi ezinokufunyanwa kwiziphumo zombuzo (igama lefayile apho ungeniso lufunyenwe khona, umtya, njl.), kodwa uxwebhu aluthethi ukuba ungazifumana njani kwaye uzisebenzise. Ke, ukuze wenze oku, kufuneka ufikelele kwipropathi ye-LinePragma kwaye izinto esizifunayo ziya kuba ngaphakathi kuyo:

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

Kufanelekile ukuyikhumbula loo nto FileName iqulathe indlela eya kwifayile, kuba sisebenzise indlela GetFirstGraph.

Isiphumo sokwenziwa

Kukho umahluko okhethekileyo ngaphakathi kweCxQL result, ebuyisela isiphumo sokwenza umthetho wakho obhaliweyo. Iqaliswa ngoko nangoko kwaye ungabhala iziphumo eziphakathi kuyo, uzitshintshe kwaye uzicokise njengoko usebenza. Kodwa, ukuba akukho sabelo kulo tshintsho okanye umsebenzi ngaphakathi komthetho return- isiphumo sokwenziwa siya kuhlala singu-zero.

Lo mbuzo ulandelayo awuzukubuyisela nantoni na kuthi ngenxa yokwenziwa kwaye uyakuhlala ungenanto:

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

Kodwa, emva kokwabela isiphumo sophumezo kwisiphumo esiguquguqukayo somlingo, siya kubona ukuba lo mnxeba ubuyisela ntoni kuthi:

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

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

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

Ukusebenzisa iziphumo zeminye imithetho

Imithetho kwi-Checkmarx inokubizwa ngokuba yifaniso kwimisebenzi kulwimi lwenkqubo oluqhelekileyo. Xa ubhala umgaqo, ungasebenzisa iziphumo zeminye imibuzo. Umzekelo, akukho mfuneko yokukhangela zonke iindlela zokufowuna kwikhowudi ngalo lonke ixesha, vele ufowunele umgaqo ofunekayo:

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

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

Le ndlela ikuvumela ukuba unciphise ikhowudi kwaye unciphise kakhulu ixesha lokuphumeza umgaqo.

Ukusombulula ingxaki

Ukugawulwa kwemithi

Xa usebenza nesixhobo, ngamanye amaxesha akunakwenzeka ukuba ubhale ngokukhawuleza umbuzo ofunekayo kwaye kufuneka uzame, uzama iindlela ezahlukeneyo. Kwimeko enjalo, isixhobo sibonelela ngokungena, okubizwa ngolu hlobo lulandelayo:

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

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

Kodwa kubalulekile ukukhumbula ukuba le ndlela yamkela kuphela njengegalelo umtya, ngoko ke ayizukwenzeka ukubonisa uluhlu olupheleleyo lweziqalelo ezifunyenweyo njengesiphumo somsebenzi wokuqala. Ukhetho lwesibini, olusetyenziselwa ukulungisa ingxaki, kukwabela ukwahluka komlingo kumaxesha ngamaxesha result isiphumo sombuzo kwaye ubone ukuba kwenzeka ntoni. Le ndlela yokwenza ayilunganga kakhulu; kufuneka uqiniseke ukuba akukho nto ingaphezulu okanye isebenza ngale khowudi emva kokuba result okanye phawula nje ikhowudi engezantsi. Okanye unako, njengam, ukulibala ukususa iifowuni ezininzi ezinjalo kumgaqo osele ulungile kwaye uzibuze ukuba kutheni kungekho nto isebenzayo.

Indlela elula ngakumbi kukufowunela indlela return ngeparameter efunekayo. Kule meko, ukuphunyezwa komgaqo kuya kuphela kwaye siya kukwazi ukubona okwenzekayo ngenxa yoko sikubhalileyo:

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

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

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

Ingxaki yokungena

Kukho iimeko apho awukwazi ukufikelela kwisixhobo se-CxAudit (esisetyenziselwa ukubhala imithetho). Zininzi izizathu zoku, kubandakanywa ukuphazamiseka, uhlaziyo lweWindows ngequbuliso, iBSOD kunye nezinye iimeko ezingalindelekanga ezingaphaya kwamandla ethu. Kule meko, ngamanye amaxesha kukho iseshoni engagqitywanga kwi-database, ekuthintela ukuba ungene kwakhona. Ukuyilungisa, kufuneka uqhube imibuzo emininzi:

YeCheckmarx phambi ko-8.6:

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

YeCheckmarx emva kwe8.6:

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

Imithetho yokubhala

Ngoku sifika kweyona nxalenye inika umdla. Xa uqala ukubhala imithetho kwi-CxQL, into odla ngokuyishiya ayingomaxwebhu amaninzi njengemizekelo ephilayo yokusombulula iingxaki ezithile kunye nokuchaza inkqubo yendlela imibuzo esebenza ngayo ngokubanzi.

Ndiza kuzama ukwenza ubomi bube lula kwabo baqala ukuntywila kulwimi lombuzo kwaye ndinike imizekelo emininzi yokusebenzisa iMibuzo yesiNtu ukusombulula iingxaki ezithile. Ezinye zazo zibanzi kwaye zinokusetyenziswa kwinkampani yakho ngaphandle kotshintsho, ezinye zithe ngqo, kodwa zinokusetyenziswa ngokutshintsha ikhowudi ukuze ihambelane nezicelo zakho.

Ke, nantsi iingxaki esidibana nazo rhoqo:

Umsebenzi: Kukho iiFlows ezininzi kwiziphumo zokwenza umgaqo kwaye enye yazo yindlwane yenye, kufuneka ushiye enye yazo.

Isixazululo: Ngokwenene, ngamanye amaxesha i-Checkmarx ibonisa ukuhamba kwedatha okuninzi okunokuthi kudlulelane kwaye ibe luguqulelo olufutshane lwabanye. Kukho indlela ekhethekileyo kwiimeko ezinjalo NciphisaFlow. Ngokuxhomekeke kwiparamitha, iya kukhetha oyena Mqulo umfutshane okanye omde:

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

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

Umsebenzi: Yandisa uluhlu lwedatha enovakalelo apho isixhobo sisabela

Isixazululo: I-Checkmarx inemigaqo esisiseko, iziphumo zayo ezisetyenziswa yeminye imibuzo emininzi. Ngokuncedisa eminye yale migaqo ngedatha ethile kwisicelo sakho, unokuphucula ngokukhawuleza iziphumo zakho zokuskena. Ngezantsi ngumzekelo womgaqo ukuze uqalise:

Uluhlu_lwemfihlo_lokuvinjwa_okubanzi

Masifake izinto ezininzi ezahlukeneyo ezisetyenziswa kwisicelo sethu ukugcina ulwazi olubuthathaka:

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

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

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

Umsebenzi: Yandisa uluhlu lwezinto eziguquguqukayo kunye namagama ayimfihlo

Isixazululo: Ndiya kuncoma ngokukhawuleza ukuba ubeke ingqalelo kumgaqo osisiseko wokuchaza amagama ayimfihlo kwikhowudi kwaye ungeze kuyo uluhlu lwamagama aguquguqukayo asetyenziswa ngokuqhelekileyo kwinkampani yakho.

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

Umsebenzi: Yongeza izikhokelo ezisetyenzisiweyo ezingaxhaswanga yiCheckmarx

Isixazululo: Yonke imibuzo kwi-Checkmarx yahlulwe ngolwimi, ngoko ke kufuneka udibanise imigaqo yolwimi ngalunye. Ngezantsi kukho imizekelo yemithetho enjalo.

Ukuba amathala eencwadi asetyenziswa ancedisayo okanye athatha indawo yokusebenza okusemgangathweni, anokongezwa ngokulula kumgaqo osisiseko. Emva koko wonke umntu oyisebenzisayo uya kufunda ngokukhawuleza ngeentshayelelo ezintsha. Njengomzekelo, iilayibrari zokungena kwi-Android yiTimber kunye neLoggi. Kwiphakheji eyisiseko, akukho migaqo yokuchonga iifowuni ezingeyiyo inkqubo, ngoko ke ukuba igama eliyimfihlo okanye isihlonzi seseshoni singena kwilogi, asiyi kuyazi ngayo. Makhe sizame ukongeza iinkcazo zeendlela ezinjalo kwimithetho yeCheckmarx.

Umzekelo wekhowudi yovavanyo esebenzisa ithala leencwadi leTimber ekugawulweni kwemithi:

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

Kwaye nanku umzekelo wesicelo se-Checkmarx, eya kukuvumela ukuba udibanise inkcazo yokubiza iindlela zeTimber njengendawo yokuphuma kwidatha esuka kwisicelo:

FumanaIziphumo zeAndroid

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

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

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

Kwaye unokongeza kumgaqo ongummelwane, kodwa lo uhambelana ngqo nokungena kwi-Android:

FumanaAndroidLog_Outputs

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

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

Kwakhona, ukuba izicelo ze-Android zisebenzisa Umphathi Womsebenzi Kumsebenzi ongahambelaniyo, luluvo olulungileyo ukwazisa ngakumbi i-Checkmarx malunga noku ngokongeza indlela yokufumana idata kumsebenzi. getInputData:

FumanaAndroidRead

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

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

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

Umsebenzi: Ukukhangela idata enovakalelo kuluhlu lweeprojekthi ze-iOS

Isixazululo: I-iOS ihlala isebenzisa iifayile ezikhethekileyo kunye nolwandiso lwe-.plist ukugcina izinto ezahlukeneyo kunye namaxabiso. Ukugcina amagama agqithisiweyo, amathokheni, izitshixo kunye nezinye iinkcukacha ezibuthathaka kwezi fayile akukhuthazwa, njengoko zinokukhutshwa kwisixhobo ngaphandle kweengxaki.

Iifayile zePlist zineempawu ezingabonakali kwiliso lenyama, kodwa zibalulekile kwi-Checkmarx. Masibhale umgaqo oza kukhangela idatha esiyidingayo kwaye usixelele ukuba iiphasiwedi okanye amathokheni akhankanywe kwenye indawo.

Umzekelo wefayile enjalo, equlethe ithokheni yonxibelelwano kunye nenkonzo yangasemva:

<?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>

Kwaye umthetho weCheckmarx, onezinto ezininzi ekufuneka zithathelwe ingqalelo xa ubhala:

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

Umsebenzi: Ukufumana ulwazi kwi-XML

Isixazululo: I-Checkmarx inemisebenzi elula kakhulu yokusebenza nge-XML kunye nokukhangela amaxabiso, iithegi, iimpawu kunye nokunye. Kodwa, ngelishwa, bekukho impazamo kumaxwebhu ngenxa yokuba akukho namnye umzekelo osebenzayo. Ngaphandle kwento yokuba esi siphene sisusiwe kuguqulelo lwamva nje lwamaxwebhu, lumka ukuba usebenzisa iinguqulelo zangaphambili zamaxwebhu.

Nanku umzekelo ongachanekanga osuka kumaxwebhu:

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

Ngenxa yomzamo wokuphumeza, siya kufumana impazamo yokuba All akukho ndlela enjalo... Kwaye oku kuyinyani, kuba kukho into ekhethekileyo, indawo eyahlukileyo yokusebenzisa imisebenzi yokusebenza nge-XML - cxXPath. Nantsi indlela umbuzo ochanekileyo ojongeka ngayo ukufumana useto kwi-Android evumela ukusetyenziswa kwetrafikhi yeHTTP:

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

Masiyijonge ngeenkcukacha ezithe kratya, kuba ulungelelwaniso lwayo yonke imisebenzi luyafana, emva kokuba ufumene enye, kufuneka ukhethe lowo uyifunayo. Ngoko ke, ngokulandelelana ngokweparameters:

  • "*.xml"-Imaski yeefayile eziza kukhangelwa

  • 8 — isazisi solwimi osetyenziswa kulo umthetho

  • "cleartextTrafficPermitted"-igama loyelelwano kwi-xml

  • "true" - ixabiso lophawu

  • false — Ukusetyenziswa kwentetho eqhelekileyo xa ukhangela

  • true — kuthetha ukuba uphendlo luya kwenziwa ukungahoyi, oko kukuthi, imeko-ayiva

Njengomzekelo, sisebenzise umgaqo ochaza okungalunganga, ukusuka kwindawo yokujonga ukhuseleko, izicwangciso zenethiwekhi kwi-Android ezivumela unxibelelwano kunye nomncedisi nge-HTTP protocol. Umzekelo wolungiselelo oluqulathe uphawu loyelelwano cleartextTrafficPermitted ngentsingiselo 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>

Umsebenzi: Nciphisa iziphumo ngegama lefayile/umendo

Isixazululo: Kwenye yeeprojekthi ezinkulu ezinxulumene nophuhliso lwesicelo esiphathwayo se-Android, siye sadibana neengxelo ezingezizo zomgaqo omisela i-obfuscation setting. Inyani kukuba umthetho ophuma kwibhokisi ukhangela kwifayile build.gradle useto olunoxanduva lokusebenzisa imithetho ye-obfuscation yoguqulelo lokukhululwa kwesicelo.

Kodwa kwiiprojekthi ezinkulu ngamanye amaxesha kukho iifayile zomntwana build.gradle, ezibhekiselele kumathala eencwadi aqukiweyo kwiprojekthi. Into engaqhelekanga kukuba nokuba ezi fayile azibonisi imfuneko yokuphazamiseka, izicwangciso zefayile yendibano yomzali ziya kusetyenziswa ngexesha lokuhlanganiswa.

Ke, umsebenzi kukusika izinto ezibangela ukuba kwiifayile zabantwana ezizethala leencwadi. Ziyakwazi ukuchongwa ngobukho bomgca apply 'com.android.library'.

Umzekelo ikhowudi kwifayile build.gradle, emisela imfuno ye-obfuscation:

apply plugin: 'com.android.application'

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

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

dependencies {
  ...
}

Umzekelo wefayile build.gradle kwithala leencwadi elibandakanyiweyo kwiprojekthi engenaso esi sicwangciso:

apply plugin: 'android-library'

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

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

Kwaye umthetho weCheckmarx:

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

Le ndlela inokuba yinto yendalo yonke kwaye iluncedo kungekuphela nje kwizicelo ze-Android, kodwa nakwezinye iimeko xa kufuneka uqikelele ukuba isiphumo sesefayile ethile.

Umsebenzi: Yongeza inkxaso yethala leencwadi lesithathu ukuba isivakalisi asixhaswanga ngokupheleleyo

Isixazululo: Inani lezakhelo ezahlukeneyo ezisetyenzisiweyo kwinkqubo yokubhala ikhowudi ivele ngaphandle kweetshathi. Ewe kunjalo, iCheckmarx ayisoloko isazi malunga nobukho bayo, kwaye umsebenzi wethu kukuyifundisa ukuqonda ukuba iindlela ezithile zezesi sikhokelo. Ngamanye amaxesha oku kuyinkimbinkimbi yinto yokuba izikhokelo zisebenzisa amagama emisebenzi axhaphake kakhulu kwaye akunakwenzeka ukumisela ngokungathandabuzekiyo ubudlelwane bomnxeba othile kwithala leencwadi elithile.

Ubunzima kukuba ulungelelwaniso lwamathala eencwadi alusoloko luqatshelwa ngokuchanekileyo kwaye kufuneka uzame ukunqanda ukufumana inani elikhulu lezinto ezingeyonyani. Kukho iindlela ezininzi zokuphucula ukuchaneka kokuskena kunye nokusombulula ingxaki:

  • Inketho yokuqala, siyazi ngokuqinisekileyo ukuba ilayibrari isetyenziswe kwiprojekthi ethile kwaye inokusebenzisa umgaqo kwinqanaba leqela. Kodwa ukuba iqela lithatha isigqibo sokuthatha indlela eyahlukileyo okanye lisebenzise amathala eencwadi amaninzi apho amagama omsebenzi adibana khona, sinokufumana umfanekiso ongemyolisi wezinto ezininzi ezingeyonyani.

  • Inketho yesibini kukukhangela iifayile apho ilayibrari ingeniswe ngokucacileyo. Ngale ndlela, sinokuqiniseka ukuba ithala leencwadi esilifunayo lisetyenziswe ngqo kule fayile.

  • Kwaye ukhetho lwesithathu kukusebenzisa ezi ndlela zimbini zingasentla kunye.

Njengomzekelo, makhe sijonge ithala leencwadi elaziwayo kwizangqa emxinwa gungqa kulwimi lwenkqubo yeScala, oko kukuthi, ukusebenza Ukwahlula imilinganiselo yoqobo. Ngokubanzi, ukudlula iparameters kumbuzo weSQL, kufuneka usebenzise umqhubi $, ethatha indawo yedatha kumbuzo owenziwe kwangaphambili weSQL. Oko kukuthi, enyanisweni, yi-analogue ngqo yeNgxelo eLungisiweyo kwiJava. Kodwa, ukuba ufuna ngamandla ukwakha umbuzo weSQL, umzekelo, ukuba ufuna ukudlulisa amagama etafile, ungasebenzisa umsebenzisi. #$, eya kutshintsha ngokuthe ngqo idatha kumbuzo (phantse ufana nokudibanisa umtya).

Ikhowudi yesampuli:

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

I-Checkmarx ayikayazi indlela yokubona ukusetyenziswa kwe-Splicing Literal Values ​​kunye nokutsiba abaqhubi #$, ngoko ke makhe sizame ukuyifundisa ukuchonga iinaliti zeSQL ezinokubakho kwaye siqaqambise iindawo ezifanelekileyo kwikhowudi:

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

Umsebenzi: Khangela imisebenzi esetyenzisiweyo esesichengeni kwiilayibrari zoMthombo oVulekileyo

Isixazululo: Iinkampani ezininzi zisebenzisa izixhobo zokubeka iliso kwi-Open-Source (i-OSA practice) ukukhangela ukusetyenziswa kweenguqulelo ezisengozini zamathala eencwadi kwizicelo eziphuhlisiwe. Ngamanye amaxesha akunakwenzeka ukuhlaziya ithala leencwadi kwinguqulelo ekhuselekileyo. Kwezinye iimeko kukho imida yokusebenza, kwezinye akukho nguqulo ekhuselekileyo konke konke. Kule meko, ukudibanisa kwe-SAST kunye ne-OSA izenzo ziya kunceda ukufumanisa ukuba imisebenzi ekhokelela ekuxhatshazweni kobuthathaka ayisetyenziswanga kwikhowudi.

Kodwa ngamanye amaxesha, ngakumbi xa ucinga ngeJavaScript, oku kusenokungabi ngumsebenzi omncinci ngokupheleleyo. Ngezantsi isisombululo, mhlawumbi asifanelekanga, kodwa nangona kunjalo sisebenza, sisebenzisa umzekelo wobuthathaka kwicandelo. lodash ngeendlela template и *set.

Imizekelo yovavanyo olunokuba semngciphekweni kwifayile ye-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!'

Kwaye xa uqhagamshela ngokuthe ngqo kwi-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>

Sikhangela zonke iindlela zethu ezisesichengeni, ezidweliswe kubuthathaka:

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

Umsebenzi: Ukukhangela izatifikethi ezifakwe kwisicelo

Isixazululo: Ayiqhelekanga kwizicelo, ngakumbi ezo ziphathwayo, ukusebenzisa izatifikethi okanye izitshixo ukufikelela kwiiseva ezahlukeneyo okanye uqinisekise i-SSL-Pinning. Ukusuka kwimbono yokhuseleko, ukugcina izinto ezinjalo kwikhowudi akuyona into engcono kakhulu. Makhe sizame ukubhala umthetho oya kukhangela iifayile ezifanayo kwindawo yokugcina:

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

Umsebenzi: Ukufumana amathokheni aphazamisekile kwisicelo

Isixazululo: Ngokuqhelekileyo kuyimfuneko ukurhoxisa amathokheni adibeneyo okanye olunye ulwazi olubalulekileyo olukhoyo kwikhowudi. Ngokuqinisekileyo, ukuwagcina ngaphakathi kwekhowudi yomthombo akuyongcamango ilungileyo, kodwa iimeko ziyahluka. Enkosi kwimibuzo yeCxQL, ukufumana izinto ezinje kulula kakhulu:

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

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

isiphelo

Ndiyathemba ukuba eli nqaku liya kuba luncedo kwabo baqala ukuqhelana nesixhobo seCheckmarx. Mhlawumbi abo baye babhala imithetho yabo ixesha elide baya kufumana into eluncedo kwesi sikhokelo.

Ngelishwa, okwangoku kukho ukunqongophala kwesixhobo apho izimvo ezintsha zinokuqokelelwa ngexesha lophuhliso lwemithetho yeCheckmarx. Yiyo loo nto sidale indawo yokugcina kwiGithub, apho siya kuthumela umsebenzi wethu ukuze wonke umntu osebenzisa i-CxQL afumane into eluncedo kuyo, kwaye abe nethuba lokwabelana ngomsebenzi wabo noluntu. Indawo yokugcina ikwinkqubo yokuzaliswa kunye nokwakhiwa komxholo, ngoko ke abaxhasi bamkelekile!

Спасиalu

umthombo: www.habr.com

Yongeza izimvo