Ibhalwa kanjani imithetho ye-Checkmarx ngaphandle kokusangana

Sawubona Habr!

Emsebenzini wethu, inkampani yethu ivame ukubhekana namathuluzi ahlukahlukene okuhlaziya amakhodi amile (SAST). Ngaphandle kwebhokisi bonke basebenza ngokwesilinganiso. Yiqiniso, konke kuncike kuphrojekthi kanye nobuchwepheshe obusetshenziswa kuyo, kanye nokuthi lobu buchwepheshe buhlanganiswe kanjani nemithetho yokuhlaziya. Ngokubona kwami, enye yezindlela ezibaluleke kakhulu lapho ukhetha ithuluzi le-SAST yikhono lokulenza ngendlela oyifisayo ukuze lihambisane nemininingwane yezinhlelo zakho zokusebenza, okungukuthi, ukubhala nokushintsha imithetho yokuhlaziya noma, njengoba ivame ukubizwa kanjalo, Imibuzo Yangokwezifiso.

Ibhalwa kanjani imithetho ye-Checkmarx ngaphandle kokusangana

Sivame ukusebenzisa i-Checkmarx - isihlaziyi sekhodi esithakazelisa kakhulu nesinamandla. Kulesi sihloko ngizokhuluma ngolwazi lwami lokubhala imithetho yokuhlaziywa kwayo.

Uhlu lokuqukethwe

entry

Okokuqala, ngithanda ukuncoma enye yezindatshana ezimbalwa zesiRashiya mayelana nezici zokubhala imibuzo ye-Checkmarx. Ishicilelwe ku-Habré ekupheleni kuka-2019 ngaphansi kwesihloko esithi: "Sawubona, Checkmarx!" Ungawubhala kanjani umbuzo we-Checkmarx SAST futhi uthole ubungozi obuhle.

Ihlola ngokuningiliziwe indlela yokubhala imibuzo yokuqala ku-CxQL (Checkmarx Query Language) kolunye uhlelo lokusebenza lokuhlola futhi ibonise imigomo eyisisekelo yokuthi imithetho yokuhlaziya isebenza kanjani.

Ngeke ngikuphinde okuchazwe kuyo, nakuba ezinye izimpambanomgwaqo zisazoba khona. Esihlokweni sami ngizozama ukuhlanganisa uhlobo "lweqoqo lezindlela zokupheka", uhlu lwezixazululo zezinkinga ezithile engihlangabezane nazo phakathi nomsebenzi wami noCheckmarx. Kwadingeka nginyakazise ingqondo yami phezu kweziningi zalezi zinkinga. Ngezinye izikhathi kwakungenalwazi olwanele emibhalweni, futhi ngezinye izikhathi kwakunzima ngisho nokuqonda ukuthi kwenziwa kanjani lokho okudingekayo. Ngethemba ukuthi okuhlangenwe nakho kwami ​​nobusuku bokungalali ngeke kube ize, futhi lokhu "kuqoqwa kwezindlela zokupheka zemibuzo yangokwezifiso" kuzokongela amahora ambalwa noma amaseli ezinzwa ambalwa. Ngakho, ake siqale!

Ulwazi olujwayelekile ngemithetho

Okokuqala, ake sibheke imiqondo embalwa eyisisekelo kanye nenqubo yokusebenza nemithetho, ukuze siqonde kangcono ukuthi kuzokwenzekani ngokulandelayo. Futhi futhi ngenxa yokuthi imibhalo ayisho lutho ngalokhu noma isakazwa kakhulu esakhiweni, esingesihle kakhulu.

  1. Imithetho isetshenziswa ngesikhathi sokuskena kuye ngokusetha ngaphambilini okukhethiwe ekuqaleni (iqoqo lemithetho esebenzayo). Ungakha inombolo engenamkhawulo yokusethwa ngaphambilini, futhi kahle ukuthi ukwakheka kanjani kuncike ekucacisweni kwenqubo yakho. Ungawaqoqa ngolimi noma ukhethe okusethiwe kuphrojekthi ngayinye. Inombolo yemithetho esebenzayo ithinta isivinini nokunemba kokuskena.

    Ibhalwa kanjani imithetho ye-Checkmarx ngaphandle kokusanganaUkusetha i-Preset kusixhumi esibonakalayo se-Checkmarx

  2. Imithetho ihlelwa ethuluzini elikhethekile elibizwa nge-CxAuditor. Lolu uhlelo lokusebenza lwedeskithophu oluxhuma kuseva esebenzisa i-Checkmarx. Leli thuluzi linezindlela ezimbili zokusebenza: imithetho yokuhlela nokuhlaziya imiphumela yokuskena osekwenziwe kakade.

    Ibhalwa kanjani imithetho ye-Checkmarx ngaphandle kokusanganaI-CxAudit interface

  3. Imithetho ku-Checkmarx ihlukaniswa ngolimi, okungukuthi, ulimi ngalunye lunesethi yalo yemibuzo. Kukhona nemithetho ejwayelekile esebenzayo kungakhathalekile ukuthi yiluphi ulimi, lena yimibuzo ebizwa ngesisekelo. Ngokwengxenye enkulu, imibuzo eyisisekelo ihlanganisa ukusesha ulwazi olusetshenziswa eminye imithetho.

    Ibhalwa kanjani imithetho ye-Checkmarx ngaphandle kokusanganaUkwehlukanisa imithetho ngolimi

  4. Imithetho ithi “Iyasebenziseka” kanye “Non-Executable” (Ikhishiwe Futhi Ayenziwa). Akulona igama elilungile ngempela, ngokubona kwami, kodwa yilokho eliyikho. Okubalulekile ukuthi umphumela wokusebenzisa imithetho “Esebenzisekayo” uzoboniswa emiphumeleni yokuskena ku-UI, futhi imithetho “Engasebenziseki” idingeka kuphela ukuze kusetshenziswe imiphumela yayo kwezinye izicelo (empeleni, umsebenzi nje).

    Ibhalwa kanjani imithetho ye-Checkmarx ngaphandle kokusanganaUkunquma uhlobo lomthetho lapho udala

  5. Ungakha imithetho emisha noma wengeze/ubhale kabusha ekhona. Ukuze ubhale kabusha umthetho, udinga ukuwuthola esihlahleni, uchofoze kwesokudla bese ukhetha okuthi "Khipha" kumenyu yokudonsela phansi. Kubalulekile ukukhumbula lapha ukuthi imithetho emisha ayifakiwe ekuqaleni futhi ayisebenzi. Ukuze uqale ukuzisebenzisa udinga ukuzisebenzisa kumenyu ethi "Preset Manager" entweni. Imithetho ebhalwe kabusha igcina izilungiselelo zayo, okungukuthi, uma umthetho ubusebenza, uzohlala unjalo futhi uzosetshenziswa ngokushesha.

    Ibhalwa kanjani imithetho ye-Checkmarx ngaphandle kokusanganaIsibonelo somthetho omusha kusixhumi esibonakalayo se-Preset Manager

  6. Ngesikhathi sokubulawa, "umuthi" wezicelo wakhiwe, okuncike kulokho. Imithetho eqoqa ulwazi ibulawa kuqala, futhi labo abayisebenzisayo okwesibili. Umphumela wokubulawa ugcinwe kunqolobane, ngakho-ke uma kungenzeka ukusebenzisa imiphumela yomthetho okhona, khona-ke kungcono ukwenza kanjalo, lokhu kuzonciphisa isikhathi sokuskena.

  7. Imithetho ingasetshenziswa emazingeni ahlukene:

  • Kuwo wonke uhlelo - izosetshenziselwa noma yikuphi ukuskena kwanoma iyiphi iphrojekthi

  • Ezingeni leqembu (Ithimba) - izosetshenziswa kuphela ukuskena amaphrojekthi eqenjini elikhethiwe.

  • Ezingeni lephrojekthi - Izosetshenziswa kuphrojekthi ethile

    Ibhalwa kanjani imithetho ye-Checkmarx ngaphandle kokusanganaUkunquma izinga lapho umthetho uzosetshenziswa khona

"Isichazamazwi" sabaqalayo

Futhi ngizoqala ngezinto ezimbalwa ezingibangele imibuzo, futhi ngizophinde ngibonise inqwaba yamasu azokwenza ukuphila kube lula kakhulu.

Ukusebenza ngezinhlu

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

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

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

Zonke izinto ezitholakele

Ngaphakathi kolimi oluskeniwe, ungathola uhlu lwazo zonke izici ezihlonzwe u-Checkmarx (izintambo, imisebenzi, amakilasi, izindlela, njll.). Lesi esinye isikhala sezinto okungafinyelelwa ngaso All. Okusho ukuthi, ukucinga into enegama elithile searchMe, ungasesha, isibonelo, ngamagama kuzo zonke izinto ezitholiwe:

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

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

Kodwa, uma udinga ukusesha ngolunye ulimi olungafakwanga ngesizathu esithile ekuskeneni (ngokwesibonelo, i-groovy kuphrojekthi ye-Android), unganweba indawo yethu yento ngokushintshashintsha:

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

Imisebenzi yokuhlaziywa kokugeleza

Le misebenzi isetshenziswa emithethweni eminingi futhi nali ishidi lokukopela elincane lalokho ekushoyo:

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

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

Ithola igama/umzila wefayela

Kunezimfanelo ezimbalwa ezingatholakala emiphumeleni yombuzo (igama lefayela lapho okufakiwe kutholwe khona, iyunithi yezinhlamvu, njll.), kodwa imibhalo ayisho ukuthi itholakala kanjani futhi isetshenziswe kanjani. Ngakho-ke, ukuze wenze lokhu, udinga ukufinyelela impahla ye-LinePragma futhi izinto esizidingayo zizotholakala ngaphakathi kwayo:

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

Kuyafaneleka ukukhumbula lokho FileName empeleni iqukethe indlela eya kufayela, njengoba sisebenzise indlela GetFirstGraph.

Umphumela wokwenza

Kukhona okuguquguqukayo okukhethekile ngaphakathi kwe-CxQL result, ebuyisela umphumela wokusebenzisa umthetho wakho obhaliwe. Iqalwa ngokushesha futhi ungabhala imiphumela emaphakathi kuyo, uyiguqule futhi uyicwenge njengoba usebenza. Kodwa, uma kungekho sabelo kulokhu kuguquguquka noma umsebenzi ngaphakathi komthetho return- umphumela wokwenza uzohlala unguziro.

Umbuzo olandelayo ngeke ubuyisele lutho kithi ngenxa yokusebenzisa futhi uzohlala ungenalutho:

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

Kodwa, njengoba sinikeze umphumela wokubulala kumphumela oguquguqukayo womlingo, sizobona ukuthi lolu cingo lubuyisela ini kithi:

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

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

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

Ukusebenzisa imiphumela yeminye imithetho

Imithetho ku-Checkmarx ingabizwa ngokufana nemisebenzi ngolimi olujwayelekile lokuhlela. Lapho ubhala umthetho, ungasebenzisa kahle imiphumela yeminye imibuzo. Isibonelo, asikho isidingo sokucinga zonke izingcingo zendlela kukhodi njalo, vele ushayele umthetho owufunayo:

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

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

Le ndlela ikuvumela ukuthi unciphise ikhodi futhi unciphise kakhulu isikhathi sokwenza umthetho.

Ukuxazululwa kwenkinga

Ukugawula

Lapho usebenza nethuluzi, ngezinye izikhathi akunakwenzeka ukubhala ngokushesha umbuzo oyifunayo futhi kufanele uzame, uzama izinketho ezahlukene. Esimweni esinjalo, ithuluzi linikeza ukugawulwa kwemithi, okubizwa ngokuthi:

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

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

Kodwa kufanelekile ukukhumbula ukuthi le ndlela yamukela kuphela njengokufakwayo umucu, ngakho-ke ngeke kwenzeke ukubonisa uhlu oluphelele lwezakhi ezitholiwe njengomphumela wokusebenza kokuqala. Inketho yesibili, esetshenziselwa ukulungisa iphutha, ukwabela ukuguquguquka komlingo ngezikhathi ezithile result umphumela wombuzo futhi ubone ukuthi kwenzekani. Le ndlela ayilula neze; udinga ukuqiniseka ukuthi akukho okungaphezulu noma ukusebenza ngalokhu kukhodi ngemuva. result noma mane ubeke amazwana ngekhodi engezansi. Noma ungakwazi, njengami, ukhohlwe ukususa izingcingo ezinjalo eziningana kumthetho owenziwe ngomumo futhi uzibuze ukuthi kungani kungasebenzi lutho.

Indlela elula kakhulu ukubiza indlela return ngepharamitha edingekayo. Kulokhu, ukuqaliswa komthetho kuzophela futhi sizokwazi ukubona ukuthi kwenzekeni ngenxa yalokho esikubhalile:

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

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

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

Inkinga yokungena

Kunezimo lapho ungakwazi ukufinyelela ithuluzi le-CxAudit (elisetshenziselwa ukubhala imithetho). Kungaba nezizathu eziningi zalokhu, okuhlanganisa ukuphahlazeka, ukuvuselelwa kweWindows kungazelelwe, iBSOD nezinye izimo ezingalindelekile esingaphezu kwamandla ethu. Kulesi simo, ngezinye izikhathi kuba neseshini engaqediwe ku-database, ekuvimbela ukuthi ungangeni futhi. Ukuze uyilungise, udinga ukwenza imibuzo eminingana:

Okwe-Checkmarx ngaphambi kuka-8.6:

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

Okwe-Checkmarx ngemva kuka-8.6:

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

Imithetho yokubhala

Manje sifika engxenyeni ethakazelisa kakhulu. Uma uqala ukubhala imithetho ku-CxQL, ovame ukuntula kuyo akuwona amaphepha amaningi njengezibonelo eziphilayo zokuxazulula izinkinga ezithile nokuchaza inqubo yokusebenza kwemibuzo ngokuvamile.

Ngizozama ukwenza impilo ibe lula kulabo abaqala ukungena olimini lwemibuzo futhi nginikeze izibonelo ezimbalwa zokusebenzisa Imibuzo Yangokwezifiso ukuxazulula izinkinga ezithile. Ezinye zazo zijwayelekile futhi zingasetshenziswa enkampanini yakho ngaphandle kwezinguquko, ezinye zicaciswe kakhudlwana, kodwa futhi zingasetshenziswa ngokushintsha ikhodi ukuze ivumelane nemininingwane yezinhlelo zakho zokusebenza.

Ngakho-ke, nazi izinkinga esibhekana nazo kakhulu:

Umsebenzi: Kukhona Ukugeleza okuningana emiphumeleni yokusebenzisa umthetho futhi enye yazo iyisidleke somunye, kufanele ushiye eyodwa yazo.

Isixazululo: Ngempela, ngezinye izikhathi i-Checkmarx ibonisa ukugeleza kwedatha okumbalwa okungase kudlulelane futhi kube inguqulo efushanisiwe yezinye. Kukhona indlela ekhethekile yamacala anjalo YehlisaUkugeleza. Kuye ngepharamitha, izokhetha Ukugeleza okufushane noma okude kakhulu:

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

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

Umsebenzi: Nweba uhlu lwedatha ebucayi lapho ithuluzi lisabela khona

Isixazululo: I-Checkmarx inemithetho eyisisekelo, imiphumela yayo esetshenziswa eminye imibuzo eminingi. Ngokufaka eminye yale mithetho ngedatha eqondene nohlelo lwakho lokusebenza, ungathuthukisa ngokushesha imiphumela yakho yokuskena. Ngezansi umthetho oyisibonelo wokukuqalisa:

General_privacy_violation_list

Ake sengeze okuguquguqukayo okuningana okusetshenziswa kuhlelo lwethu lokusebenza ukugcina ulwazi olubucayi:

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

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

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

Umsebenzi: Nweba uhlu lwezinto eziguquguqukayo ngamaphasiwedi

Isixazululo: Ngingancoma ukuthi unake ngokushesha umthetho oyisisekelo wokuchaza amagama ayimfihlo ngekhodi futhi wengeze kuwo uhlu lwamagama aguquguqukayo avame ukusetshenziswa enkampanini 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: Engeza izinhlaka ezisetshenzisiwe ezingasekelwe yi-Checkmarx

Isixazululo: Yonke imibuzo ku-Checkmarx ihlukaniswa ngolimi, ngakho udinga ukwengeza imithetho yolimi ngalunye. Ngezansi kunezibonelo zemithetho enjalo.

Uma kusetshenziswa amalabhulali ahambisanayo noma ashintsha umsebenzi ojwayelekile, angangezwa kalula kumthetho oyisisekelo. Khona-ke wonke umuntu oyisebenzisayo uzofunda ngokushesha mayelana nezingeniso ezintsha. Njengesibonelo, imitapo yolwazi yokungena ku-Android i-Timber ne-Loggi. Ephaketheni eliyisisekelo, ayikho imithetho yokuhlonza izingcingo ezingezona ezohlelo, ngakho-ke uma iphasiwedi noma isihlonzi seseshini singena kulogi, ngeke sazi ngakho. Ake sizame ukwengeza izincazelo zezindlela ezinjalo emithethweni ye-Checkmarx.

Isibonelo sekhodi yokuhlola esebenzisa umtapo wezincwadi we-Timber ukuze ungene:

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

Futhi nasi isibonelo sesicelo se-Checkmarx, esizokuvumela ukuthi ungeze incazelo yokubiza izindlela ze-Timber njengendawo yokuphuma yedatha evela kuhlelo lokusebenza:

FindAndroidOutputs

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

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

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

Futhi ungakwazi ukwengeza emthethweni ongumakhelwane, kodwa lokhu kuhlobana ngqo nokungena ngemvume ku-Android:

TholaI-AndroidLog_Outputs

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

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

Futhi, uma izinhlelo zokusebenza ze-Android zisebenzisa Umphathi Womsebenzi ngomsebenzi ongavumelanisiwe, kuwumqondo omuhle ukwazisa i-Checkmarx mayelana nalokhu ngokwengeza indlela yokuthola idatha emsebenzini. getInputData:

TholaAndroidRead

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

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

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

Umsebenzi: Isesha idatha ebucayi kuhlu lwamaphrojekthi we-iOS

Isixazululo: I-iOS ivamise ukusebenzisa amafayela akhethekile anesandiso se-.plist ukuze igcine okuguquguqukayo namanani ahlukahlukene. Ukugcina amaphasiwedi, amathokheni, okhiye nenye idatha ebucayi kulawa mafayela akunconywa, njengoba angakhishwa kudivayisi ngaphandle kwezinkinga.

Amafayela e-Plist anezici ezingabonakali ngeso lenyama, kodwa zibalulekile ku-Checkmarx. Masibhale umthetho ozosesha idatha esiyidingayo futhi usitshele uma amagama ayimfihlo noma amathokheni ashiwo ndawana thize.

Isibonelo sefayela elinjalo, eliqukethe ithokheni yokuxhumana nesevisi yasemuva:

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

Futhi umthetho we-Checkmarx, onama-nuances amaningana okufanele acatshangelwe lapho 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: Ukuthola ulwazi ku-XML

Isixazululo: I-Checkmarx inemisebenzi elula kakhulu yokusebenza nge-XML nokusesha amanani, amathegi, izibaluli nokunye. Kodwa, ngeshwa, kube nephutha embhalweni ngenxa yokuthi asikho nesisodwa isibonelo esisebenzayo. Naphezu kweqiniso lokuthi lesi sici sisusiwe enguqulweni yakamuva yamadokhumenti, qaphela uma usebenzisa izinguqulo zangaphambili zamadokhumenti.

Nasi isibonelo esingalungile esivela kumadokhumenti:

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

Njengomphumela womzamo wokwenza, sizothola iphutha lokuthi All ayikho indlela enjalo... Futhi lokhu kuyiqiniso, njengoba kunendawo ekhethekile, ehlukene yento yokusebenzisa imisebenzi yokusebenza nge-XML - cxXPath. Lena indlela umbuzo olungile obukeka ngayo ukuze uthole isilungiselelo ku-Android esivumela ukusetshenziswa kwethrafikhi ye-HTTP:

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

Ake sikubheke ngemininingwane eyengeziwe, njengoba i-syntax yayo yonke imisebenzi iyafana, ngemuva kokuthola eyodwa, udinga nje ukukhetha oyidingayo. Ngakho, ngokulandelana ngokuvumelana nemingcele:

  • "*.xml"— imaski yamafayela azoseshwa

  • 8 — umazisi wolimi umthetho osetshenziswa kulo

  • "cleartextTrafficPermitted"- Igama lesibaluli ku-xml

  • "true" - ukubaluleka kwalesi sici

  • false - ukusetshenziswa kwenkulumo evamile lapho usesha

  • true — kusho ukuthi ukusesha kuzokwenziwa ukunganaki, okungukuthi, ukungazweli

Njengesibonelo, sisebenzise umthetho okhomba okungalungile, ngokombono wezokuphepha, izilungiselelo zokuxhuma kwenethiwekhi ku-Android ezivumela ukuxhumana neseva ngephrothokholi ye-HTTP. Isibonelo sesilungiselelo esiqukethe isibaluli cleartextTrafficPermitted ngencazelo 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: Khawulela imiphumela ngegama/ngendlela yefayela

Isixazululo: Kwenye yamaphrojekthi amakhulu ahlobene nokuthuthukiswa kohlelo lokusebenza lweselula lwe-Android, sihlangabezane nemibono engamanga yomthetho onquma isilungiselelo se-obfuscation. Iqiniso liwukuthi umthetho ophuma ebhokisini usesha efayeleni build.gradle isilungiselelo esinesibopho sokusebenzisa imithetho ye-obfuscation yenguqulo yokukhishwa yohlelo lokusebenza.

Kodwa kumaphrojekthi amakhulu ngezinye izikhathi kunamafayela ezingane build.gradle, ebhekisela emitatsheni yolwazi efakwe kuphrojekthi. Okukhethekile ukuthi noma lawa mafayela engabonisi isidingo sokufiphala, izilungiselelo zefayela lomhlangano womzali zizosetshenziswa ngesikhathi sokuhlanganiswa.

Ngakho, umsebenzi uwukunqamula izibangeli kumafayela ezingane okungezamitapo yolwazi. Zingabonakala ngokuba khona komugqa apply 'com.android.library'.

Isibonelo sekhodi kusuka kufayela build.gradle, enquma isidingo se-obfuscation:

apply plugin: 'com.android.application'

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

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

dependencies {
  ...
}

Ifayela eliyisibonelo build.gradle kumtapo wolwazi ofakwe kuphrojekthi engenakho lokhu kulungiselelwa:

apply plugin: 'android-library'

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

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

Futhi umthetho we-Checkmarx:

I-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 ingaba yinto yonke futhi isebenziseke hhayi kuphela kuzinhlelo zokusebenza ze-Android, kodwa nakwezinye izimo lapho udinga ukunquma ukuthi umphumela ungowefayela elithile.

Umsebenzi: Engeza usekelo lwelabhulali yezinkampani zangaphandle uma i-syntax ingasekelwe ngokugcwele

Isixazululo: Inani lezinhlaka ezihlukene ezisetshenziswa ohlelweni lokubhala ikhodi livele lingekho emashadini. Yebo, i-Checkmarx ayihlali yazi ngobukhona bazo, futhi umsebenzi wethu uwukufundisa ukuqonda ukuthi izindlela ezithile zingezalolu hlaka. Kwesinye isikhathi lokhu kuba nzima yiqiniso lokuthi izinhlaka zisebenzisa amagama emisebenzi ajwayeleke kakhulu futhi akunakwenzeka ukucacisa ngokusobala ubudlelwano bocingo oluthile kumtapo wolwazi othile.

Ubunzima ukuthi i-syntax yelabhulali enjalo ayihlali ibonwa ngendlela efanele futhi kufanele uzame ukugwema ukuthola inani elikhulu lezinto ezingamanga. Kunezinketho ezimbalwa zokuthuthukisa ukunemba kokuskena nokuxazulula inkinga:

  • Inketho yokuqala, siyazi ngokuqinisekile ukuthi ilabhulali isetshenziswa kuphrojekthi ethile futhi ingasebenzisa umthetho ezingeni leqembu. Kodwa uma iqembu lithatha isinqumo sokuthatha indlela ehlukile noma lisebenzisa amalabhulali ambalwa lapho amagama emisebenzi agqagqana khona, singathola isithombe esingajabulisi sezinto eziningi ezingamanga.

  • Inketho yesibili ukucinga amafayela lapho umtapo wolwazi ungeniswa khona ngokucacile. Ngale ndlela, singaqiniseka ukuthi umtapo wezincwadi esiwudingayo usetshenziswa ncamashi kuleli fayela.

  • Futhi inketho yesithathu ukusebenzisa izindlela ezimbili ezingenhla ndawonye.

Njengesibonelo, ake sibheke umtapo wezincwadi owaziwa kakhulu emibuthanweni emincane hlanya ngolimi lohlelo lwe-Scala, okungukuthi, ukusebenza Ukuhlukanisa Amanani Angokoqobo. Ngokuvamile, ukuze udlulisele amapharamitha embuzweni we-SQL, kufanele usebenzise opharetha $, efaka esikhundleni idatha embuzweni we-SQL owakhiwe kusengaphambili. Okusho ukuthi, empeleni, i-analogue eqondile Yesitatimende Esilungiselelwe ku-Java. Kodwa, uma udinga ukwakha umbuzo we-SQL ngamandla, isibonelo, uma udinga ukudlulisa amagama etafula, ungasebenzisa opharetha. #$, okuzofaka ngokuqondile endaweni yedatha embuzweni (cishe njengokuhlanganisa kweyunithi yezinhlamvu).

Ikhodi yesampula:

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

I-Checkmarx ayikakwazi ukubona ukusetshenziswa kwe-Splicing Literal Values ​​futhi yeqa ama-opharetha #$, ngakho-ke ake sizame ukuyifundisa ukukhomba imijovo ye-SQL engaba khona futhi sigqamise izindawo ezifanele kukhodi:

// Находим все импорты
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: Sesha imisebenzi esetshenziswa engcupheni kumalabhulali womthombo ovulekile

Isixazululo: Izinkampani eziningi zisebenzisa amathuluzi okuqapha e-Open-Source (umkhuba we-OSA) ukuze zithole ukusetshenziswa kwezinguqulo ezisengozini zamalabhulali ezinhlelweni ezithuthukisiwe. Kwesinye isikhathi akwenzeki ukubuyekeza umtapo onjalo ube yinguqulo evikelekile. Kwezinye izimo kunemikhawulo yokusebenza, kwezinye ayikho inguqulo ephephile nhlobo. Kulesi simo, inhlanganisela yezinqubo ze-SAST ne-OSA zizosiza ukunquma ukuthi imisebenzi eholela ekuxhashazweni kobungozi ayisetshenziswa kukhodi.

Kodwa ngezinye izikhathi, ikakhulukazi uma ucabangela i-JavaScript, lokhu kungase kungabi umsebenzi omncane ngokuphelele. Ngezansi kunesixazululo, mhlawumbe esingalungile, kodwa noma kunjalo siyasebenza, sisebenzisa isibonelo sobuthakathaka engxenyeni lodash ngezindlela template и *set.

Izibonelo zekhodi yokuhlola okungenzeka ibe sengozini kufayela le-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!'

Futhi lapho uxhuma ngokuqondile ku-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>

Sibheka zonke izindlela zethu ezisengozini, ezibalwe ezingozini:

// Ищем все строки: в которых встречается строка 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: Isesha izitifiketi ezishumekwe kuhlelo lokusebenza

Isixazululo: Akuvamile ukuthi izinhlelo zokusebenza, ikakhulukazi eziphathwayo, zisebenzise izitifiketi noma okhiye ukuze zifinyelele amaseva ahlukahlukene noma ziqinisekise i-SSL-Pinning. Ngokombono wezokuphepha, ukugcina izinto ezinjalo ngekhodi akuyona inkambiso engcono kakhulu. Ake sizame ukubhala umthetho ozosesha amafayela afanayo endaweni 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: Ukuthola amathokheni onakalisiwe kuhlelo lokusebenza

Isixazululo: Ngokuvamile kuyadingeka ukuhoxisa amathokheni onakalisiwe noma olunye ulwazi olubalulekile olukhona kukhodi. Yebo, ukuwagcina ngaphakathi kwekhodi yomthombo akuwona umqondo omuhle, kodwa izimo ziyahlukahluka. Ngenxa yemibuzo ye-CxQL, ukuthola izinto ezinjengalezi kulula kakhulu:

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

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

isiphetho

Ngithemba ukuthi lesi sihloko sizoba usizo kulabo abaqala ukujwayelana nethuluzi le-Checkmarx. Mhlawumbe labo asebebhale imithetho yabo isikhathi eside bazothola okuthile okuwusizo kulo mhlahlandlela.

Ngeshwa, okwamanje kukhona ukuntuleka kwensiza lapho imibono emisha ingaqoqwa khona ngesikhathi kuthuthukiswa imithetho ye-Checkmarx. Yingakho sakha indawo yokugcina ku-Github, lapho sizothumela khona umsebenzi wethu ukuze wonke umuntu osebenzisa i-CxQL athole okuthile okuwusizo kuyo, futhi abe nethuba lokuhlanganyela umsebenzi wakhe nomphakathi. Inqolobane isenqubweni yokugcwalisa nokuhlela okuqukethwe, ngakho abanikelayo bamukelekile!

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

Source: www.habr.com

Engeza amazwana