Otu esi ede iwu maka Checkmarx na-agbaghị ara

Ndewo, Habr!

N'ime ọrụ anyị, ụlọ ọrụ anyị na-ejikarị ngwaọrụ nyocha koodu static dị iche iche (SAST). Site na igbe ahụ, ha niile na-arụ ọrụ nkezi. N'ezie, ihe niile dabere na oru ngo na teknụzụ ndị a na-eji na ya, yana otu esi ekpuchi teknụzụ ndị a nke ọma site na iwu nyocha. N'uche nke m, otu n'ime njirimara kachasị mkpa mgbe ị na-ahọrọ ngwá ọrụ SAST bụ ikike ịhazi ya na nkọwa nke ngwa gị, ya bụ, dee ma gbanwee iwu nyocha ma ọ bụ, dị ka a na-akpọkarị ha, Ajụjụ Omenala.

Otu esi ede iwu maka Checkmarx na-agbaghị ara

Anyị na-ejikarị Checkmarx - ihe nyocha koodu na-adọrọ mmasị ma dị ike. N'isiokwu a, m ga-ekwu banyere ahụmahụ m nke ide iwu nyocha maka ya.

Isiokwu dị n’ime

entry

Iji malite, ọ ga-amasị m ịkwado otu n'ime akụkọ ole na ole n'asụsụ Russian gbasara njirimara nke ajụjụ ederede maka Checkmarx. E bipụtara ya na Habré na njedebe nke 2019 n'okpuru aha: "Ndewo, Checkmarx!" Otu esi ede ajụjụ Checkmarx SAST wee chọta adịghị ike dị mma.

Ọ na-enyocha n'ụzọ zuru ezu ka esi ede ajụjụ mbụ na CxQL (Checkmarx Query Language) maka ụfọdụ ngwa ule wee gosi ụkpụrụ bụ isi nke ka iwu nyocha si arụ ọrụ.

Agaghị m ekwughachi ihe akọwara na ya, ọ bụ ezie na ụfọdụ ụzọ ụzọ ka ga-adị. N'ime edemede m, m ga-agbalị ịchịkọta ụdị "nchịkọta ntụziaka", ndepụta nke ngwọta maka nsogbu ụfọdụ m zutere n'oge ọrụ m na Checkmarx. Ekwesịrị m ịchịkọta ụbụrụ m maka ọtụtụ nsogbu ndị a. Mgbe ụfọdụ, enweghị ozi zuru oke na akwụkwọ ahụ, na mgbe ụfọdụ ọ na-esiri ike ịghọta otu esi eme ihe achọrọ. Enwere m olileanya na ahụmahụ m na ehihie na-ehi ụra agaghị abụ ihe efu, na "nchịkọta nke omenala ajụjụ ntụziaka" ga-azọpụta gị awa ole na ole ma ọ bụ di na nwunye nke irighiri akwara. Ya mere, ka anyị malite!

Ozi izugbe na iwu

Nke mbụ, ka anyị leba anya n'echiche ole na ole bụ isi na usoro nke ịrụ ọrụ na iwu, maka nghọta ka mma nke ihe ga-eme n'ọdịnihu. Na kwa n'ihi na akwụkwọ ahụ ekwughị ihe ọ bụla gbasara nke a ma ọ bụ gbasaa nke ọma na nhazi ahụ, nke na-adịghị mma.

  1. A na-etinye iwu ndị a n'oge nyocha dabere na ntọala ahọpụtara na mbido (usoro iwu na-arụ ọrụ). Ị nwere ike ịmepụta ọnụ ọgụgụ presets na-akparaghị ókè, na otu esi ahazi ha na-adabere na nkọwa nke usoro gị. Ị nwere ike chịkọta ha n'asụsụ ma ọ bụ họrọ ihe atọrọ maka ọrụ ọ bụla. Ọnụ ọgụgụ nke iwu na-arụ ọrụ na-emetụta ọsọ na izi ezi nke nyocha.

    Otu esi ede iwu maka Checkmarx na-agbaghị araỊtọlite ​​​​preset na interface Checkmarx

  2. A na-edezi iwu ndị a na ngwa ọrụ pụrụ iche akpọrọ CxAuditor. Nke a bụ ngwa desktọpụ na-ejikọ na sava na-agba Checkmarx. Ngwá ọrụ a nwere ụdị ọrụ abụọ: iwu ndezi na nyochaa nsonaazụ nyocha emerelarị.

    Otu esi ede iwu maka Checkmarx na-agbaghị araCxAudit interface

  3. A na-ekewa iwu na Checkmarx site na asụsụ, ya bụ, asụsụ ọ bụla nwere ajụjụ nke ya. E nwekwara ụfọdụ iwu izugbe na-emetụta n'agbanyeghị asụsụ, ndị a bụ ihe a na-akpọ ajụjụ ndị bụ isi. Maka ọtụtụ akụkụ, ajụjụ ndị bụ isi gụnyere ịchọ ozi nke iwu ndị ọzọ na-eji.

    Otu esi ede iwu maka Checkmarx na-agbaghị araIji asụsụ kewaa iwu

  4. Iwu bụ "Emezue" na "Na-adịghị emezu" (Emere na-adịghị egbu). Ọ bụghị aha ziri ezi, n'echiche m, mana nke ahụ bụ ihe ọ bụ. Isi ala bụ na a ga-egosipụta nsonaazụ nke imezu iwu “Executable” na nsonaazụ nyocha na UI, yana iwu “anaghị emezu” achọrọ naanị iji nsonaazụ ha na arịrịọ ndị ọzọ (n'ezie, ha bụ naanị ọrụ. ).

    Otu esi ede iwu maka Checkmarx na-agbaghị araNa-ekpebi ụdị iwu mgbe ị na-eke

  5. Ị nwere ike ịmepụta iwu ọhụrụ ma ọ bụ tinye / degharịa ndị dị adị. Iji degharịa iwu, ịkwesịrị ịchọta ya na osisi ahụ, pịa aka nri wee họrọ "Wepụ" site na menu ndọpụta. Ọ dị mkpa icheta ebe a na iwu ọhụrụ anaghị etinye na mbụ na presets na anaghị arụ ọrụ. Iji malite iji ha, ịkwesịrị ịgbalite ha na menu "Preset Manager" na ngwa. Iwu edegharịrị na-ejigide ntọala ha, ya bụ, ọ bụrụ na iwu ahụ na-arụ ọrụ, ọ ga-adị otú ahụ, a ga-etinyekwa ya ozugbo.

    Otu esi ede iwu maka Checkmarx na-agbaghị araỌmụmaatụ nke iwu ọhụrụ na interface Preset Manager

  6. N'oge ogbugbu, a na-ewu "osisi" nke arịrịọ, nke dabere na ihe. A na-ebu ụzọ mee iwu ndị na-anakọta ozi, na ndị na-eji ya eme ihe nke abụọ. A na-echekwa nsonaazụ igbu egbu, yabụ ọ bụrụ na ọ ga-ekwe omume iji nsonaazụ nke iwu dị adị, mgbe ahụ ọ ka mma ime ya, nke a ga-ebelata oge nyocha.

  7. Enwere ike itinye iwu na ọkwa dị iche iche:

  • Maka usoro dum - a ga-eji maka nyocha ọ bụla nke ọrụ ọ bụla

  • Na ọkwa otu (Team) - a ga-eji naanị nyochaa ọrụ na otu ahọpụtara.

  • Na ọkwa oru ngo - A ga-etinye ya n'ọrụ na otu ọrụ

    Otu esi ede iwu maka Checkmarx na-agbaghị araỊchọpụta ọkwa nke a ga-etinye iwu

"Ọkọwa okwu" maka ndị mbido

M ga-amalite site na ihe ole na ole kpatara m ajụjụ, m ga-egosikwa ọtụtụ usoro ga-eme ka ndụ dịkwuo mfe.

Ọrụ na ndepụta

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

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

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

Ihe niile achọtara

N'ime asụsụ nyochara, ị nwere ike nweta ndepụta kpamkpam ihe niile Checkmarx achọpụtala (ụdọ, ọrụ, klaasị, ụzọ, wdg). Nke a bụ ụfọdụ oghere ihe enwere ike isi na ya nweta All. Ya bụ, ịchọ ihe nwere aha akpọrọ aha searchMe, ị nwere ike chọọ, dịka ọmụmaatụ, n'aha n'ofe ihe niile achọtara:

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

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

Mana, ọ bụrụ na ịchọrọ ịchọ n'asụsụ ọzọ na n'ihi ihe ụfọdụ etinyeghị ya na nyocha ahụ (dịka ọmụmaatụ, groovy na ọrụ gam akporo), ị nwere ike ịgbasa oghere ihe anyị site na mgbanwe:

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

Ọrụ maka nyocha Flow

A na-eji ọrụ ndị a n'ọtụtụ iwu ma ebe a bụ ntakịrị mpempe akwụkwọ aghụghọ nke ihe ha pụtara:

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

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

Ịnweta aha faịlụ / ụzọ

Enwere ọtụtụ àgwà nwere ike ịnweta site na nsonaazụ nke ajụjụ (aha faịlụ nke a chọtara ntinye, eriri, wdg), mana akwụkwọ anaghị ekwu otu esi enweta na iji ha. Yabụ, iji mee nke a, ịkwesịrị ịnweta akụrụngwa LinePragma na ihe anyị chọrọ ga-adị n'ime ya:

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

Okwesiri iburu n'uche na FileName nwere n'ezie ụzọ faịlụ ahụ, ebe anyị na-eji usoro ahụ GetFirstGraph.

Nsonaazụ igbu

Enwere mgbanwe pụrụ iche n'ime CxQL result, nke na-eweghachi nsonaazụ nke imezu iwu ederede gị. A na-ebido ya ozugbo ma ị nwere ike dee nsonaazụ etiti n'ime ya, gbanwee ma mezie ha ka ị na-arụ ọrụ. Ma, ọ bụrụ na enweghị ọrụ na mgbanwe a ma ọ bụ ọrụ n'ime iwu return- nsonaazụ ogbugbu ga-abụ efu mgbe niile.

Ajụjụ na-esonụ agaghị eweghachi anyị ihe ọ bụla n'ihi ogbugbu, ọ ga-abụkwa ihe efu mgbe niile:

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

Mana, ebe ekenyela nsonaazụ ogbugbu na nsonaazụ anwansi, anyị ga-ahụ ihe oku a na-alaghachikwute anyị:

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

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

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

Iji nsonaazụ nke iwu ndị ọzọ

Enwere ike ịkpọ iwu dị na Checkmarx yiri ọrụ n'asụsụ mmemme oge niile. Mgbe ị na-ede iwu, ịnwere ike iji nsonaazụ nke ajụjụ ndị ọzọ. Dịka ọmụmaatụ, ọ dịghị mkpa ịchọ usoro oku niile na koodu oge ọ bụla, naanị kpọọ iwu achọrọ:

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

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

Usoro a na-enye gị ohere ime ka koodu ahụ dị mkpụmkpụ ma belata oge igbu oge.

Ngwọta nke nsogbu

Ịbanye

Mgbe ị na-arụ ọrụ na ngwá ọrụ, mgbe ụfọdụ, ọ gaghị ekwe omume ozugbo dee ajụjụ achọrọ ma ị ga-anwale, na-agbalị nhọrọ dị iche iche. Maka ikpe dị otú ahụ, ngwá ọrụ ahụ na-enye osisi, nke a na-akpọ dị ka ndị a:

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

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

Mana ọ bara uru icheta na usoro a na-anabata naanị dị ka ntinye eriri, yabụ na ọ gaghị ekwe omume igosipụta ndepụta zuru oke nke ihe ndị a chọtara n'ihi ọrụ mbụ. Nhọrọ nke abụọ, nke a na-eji maka nbipu, bụ ikenye na mgbanwe anwansi site n'oge ruo n'oge result nsonaazụ nke ajụjụ ahụ wee hụ ihe na-eme. Usoro a adịghị adaba nke ukwuu; ịkwesịrị ijide n'aka na enweghị nkwụsị ma ọ bụ arụ ọrụ na nke a na koodu mgbe emechara result ma ọ bụ kwuo naanị koodu dị n'okpuru. Ma ọ bụ ị nwere ike, dị ka m, chefuo iwepu ọtụtụ oku dị otú ahụ site na iwu emebere ma na-eche ihe kpatara na ọ nweghị ihe na-arụ ọrụ.

Ụzọ kachasị mma bụ ịkpọ usoro ahụ return na oke achọrọ. N'okwu a, mmezu nke iwu ga-akwụsị ma anyị ga-enwe ike ịhụ ihe mere n'ihi ihe anyị dere:

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

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

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

Nsogbu nbanye

Enwere ọnọdụ mgbe ị nweghị ike ịnweta ngwa CxAudit (nke a na-eji ede iwu). Enwere ike inwe ọtụtụ ihe kpatara nke a, gụnyere mkpọka, mmelite Windows mberede, BSOD na ọnọdụ ndị ọzọ a na-atụghị anya ya bụ nke karịrị ike anyị. N'okwu a, mgbe ụfọdụ enwere nnọkọ na-emechabeghị na nchekwa data, nke na-egbochi gị ịbanye ọzọ. Iji dozie ya, ịkwesịrị ịme ọtụtụ ajụjụ:

Maka Checkmarx tupu 8.6:

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

Maka Checkmarx mgbe 8.6 gasịrị:

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

Iwu ide

Ugbu a, anyị ga-eru akụkụ kacha adọrọ mmasị. Mgbe ịmalitere ide iwu na CxQL, ihe ị na-enwekarị abụghị akwụkwọ dị ka ụfọdụ ihe atụ dị ndụ nke idozi nsogbu ụfọdụ na ịkọwa usoro nke ka ajụjụ si arụ ọrụ n'ozuzu.

M ga-agbalị ime ka ndụ dịkwuo mfe maka ndị na-amalite ịbanye n'ime asụsụ ajụjụ ma nye ọtụtụ ihe atụ nke iji ajụjụ omenala iji dozie ụfọdụ nsogbu. Ụfọdụ n'ime ha bụ nnọọ n'ozuzu na ike ga-eji na gị ụlọ ọrụ na-enweghị mgbanwe, ndị ọzọ bụ ndị ọzọ kpọmkwem, ma ha nwekwara ike ga-eji site na-agbanwe koodu na-adaba kpọmkwem nke ngwa gị.

Yabụ, nke a bụ nsogbu anyị na-enwekarị:

Ọrụ: Enwere ọtụtụ Flow na nsonaazụ nke imezu iwu na otu n'ime ha bụ akwụ nke ọzọ, ị ga-ahapụrịrị otu n'ime ha.

ngwọta: N'ezie, mgbe ụfọdụ Checkmarx na-egosi ọtụtụ ọbịbịa data nwere ike ịgbakọ ma bụrụ ụdị mkpirisi nke ndị ọzọ. Enwere usoro pụrụ iche maka ikpe ndị dị otú ahụ Belata Flow. Dabere na oke, ọ ga-ahọrọ Flow kacha dị mkpụmkpụ ma ọ bụ kacha ogologo:

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

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

Ọrụ: Gbasaa ndepụta nke data nwere mmetụta nke ngwaọrụ ahụ na-emeghachi omume

ngwọta: Checkmarx nwere iwu ndị bụ isi, nke ọtụtụ ajụjụ ndị ọzọ na-eji nsonaazụ ya. Site na ịgbakwunye ụfọdụ iwu ndị a na data akọwapụtara na ngwa gị, ị nwere ike melite nsonaazụ nyocha gị ozugbo. N'okpuru bụ iwu ọmụmaatụ iji malite:

General_privacy_violation_list

Ka anyị gbakwunye ọtụtụ mgbanwe ndị a na-eji na ngwa anyị iji chekwaa ozi dị nro:

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

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

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

Ọrụ: Jiri okwuntughe gbasaa ndepụta mgbanwe

ngwọta: M ga-akwado ozugbo ịṅa ntị na iwu bụ isi maka ịkọwa okwuntughe na koodu na ịgbakwunye ya ndepụta aha agbanwe agbanwe nke a na-ejikarị na ụlọ ọrụ gị.

Ndepụta okwuntughe_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);
	}
}

Ọrụ: Tinye usoro eji eme ihe nke Checkmarx na-akwadoghị

ngwọta: A na-ekewa ajụjụ niile dị na Checkmarx site na asụsụ, yabụ ịkwesịrị ịgbakwunye iwu maka asụsụ ọ bụla. N'okpuru bụ ọmụmaatụ ụfọdụ nke iwu ndị a.

Ọ bụrụ na a na-eji ọba akwụkwọ ndị na-emeju ma ọ bụ dochie ọrụ ọkọlọtọ, enwere ike itinye ha ngwa ngwa na iwu bụ isi. Mgbe ahụ, onye ọ bụla na-eji ya ga-amụta ozugbo banyere mmalite ọhụrụ. Dịka ọmụmaatụ, ọba akwụkwọ maka ịbanye na gam akporo bụ Timber na Loggi. Na ngwugwu bụ isi, enweghị iwu maka ịchọpụta oku na-abụghị sistemụ, yabụ ọ bụrụ na paswọọdụ ma ọ bụ ihe nchọpụta nnọkọ abanye na log, anyị agaghị ama ya. Ka anyị gbalịa ịgbakwunye nkọwa nke ụzọ ndị dị otú ahụ na iwu Checkmarx.

Nlele koodu atụ nke na-eji ọba akwụkwọ Timber maka itinye osisi:

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

Ma ebe a bụ ọmụmaatụ nke arịrịọ maka Checkmarx, nke ga-enye gị ohere itinye nkọwa nke ịkpọ ụzọ Timber dị ka ebe ọpụpụ maka data sitere na ngwa:

Chọta ihe nrụpụta gam akporo

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

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

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

Ma ị nwekwara ike ịgbakwunye na iwu agbataobi, mana nke a metụtara ịbanye na gam akporo:

ChọtaAndroidLog_Opụta

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

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

Ọzọkwa, ọ bụrụ na ngwa Android na-eji Onye njikwa ọrụ maka ọrụ asynchronous, ọ dị mma ịgwakwa Checkmarx maka nke a site na ịgbakwunye usoro maka ịnweta data site na ọrụ ahụ. getInputData:

ChọtaAndroidRead

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

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

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

Ọrụ: Na-achọ data nwere mmetụta na plist maka ọrụ iOS

ngwọta: iOS na-ejikarị faịlụ pụrụ iche nwere ndọtị .plist iji chekwaa mgbanwe na ụkpụrụ dị iche iche. A naghị atụ aro ịchekwa okwuntughe, akara akara, igodo na data ndị ọzọ nwere mmetụta na faịlụ ndị a, n'ihi na enwere ike wepụ ha na ngwaọrụ ahụ n'enweghị nsogbu ọ bụla.

Plist faịlụ nwere atụmatụ na-apụtachaghị ìhè na anya gba ọtọ, mana ọ dị mkpa na Checkmarx. Ka anyị dee iwu ga-achọ data anyị chọrọ wee gwa anyị ma ọ bụrụ na akpọtụrụ okwuntughe ma ọ bụ akara ngosi ebe.

Ihe atụ nke faịlụ dị otú ahụ, nke nwere akara maka nkwurịta okwu na ọrụ azụ azụ:

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

Na iwu maka Checkmarx, nke nwere ọtụtụ nuances kwesịrị iburu n'uche mgbe ị na-ede:

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

Ọrụ: Ịchọta ozi na XML

ngwọta: Checkmarx nwere ọrụ dị mma maka ịrụ ọrụ na XML yana ịchọ ụkpụrụ, mkpado, njirimara na ndị ọzọ. Ma, ọ dị mwute ikwu, e nwere njehie na akwụkwọ n'ihi na ọ dịghị otu ihe atụ na-arụ ọrụ. N'agbanyeghị eziokwu ahụ bụ na e kpochapụrụ ntụpọ a na akwụkwọ ọhụrụ kachasị ọhụrụ, kpachara anya ma ọ bụrụ na ị na-eji nsụgharị mbụ nke akwụkwọ.

Nke a bụ ọmụmaatụ ezighi ezi site na akwụkwọ ahụ:

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

N'ihi mgbalị ogbugbu ahụ, anyị ga-enweta njehie na All ọ dịghị usoro dị otú ahụ ... Ma nke a bụ eziokwu, ebe ọ bụ na e nwere ihe pụrụ iche, ihe dị iche iche ohere maka iji ọrụ maka ịrụ ọrụ na XML - cxXPath. Nke a bụ ajụjụ ziri ezi dị ka ịchọta ntọala na gam akporo na-enye ohere iji okporo ụzọ HTTP:

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

Ka anyị leba anya na ya na ntakịrị nkọwa, ebe ọ bụ na syntax maka ọrụ niile yiri ya, mgbe ị chọpụtachara otu, naanị ị ga-ahọrọ nke ị chọrọ. Yabụ, n'usoro dabere na paramita ndị a:

  • "*.xml"- nkpuchi faịlụ a ga-achọ

  • 8 - id nke asụsụ nke etinyere iwu

  • "cleartextTrafficPermitted"- aha njirimara na xml

  • "true" - uru nke àgwà a

  • false - iji okwu mgbe niile mgbe ị na-achọ

  • true - pụtara na a ga-eme ọchụchọ ahụ na-eleghara ikpe anya, ya bụ, ikpe na-enweghị isi

Dịka ọmụmaatụ, anyị na-eji iwu na-achọpụta ezighi ezi, site na echiche nchekwa, ntọala njikọ netwọk na gam akporo nke na-enye ohere nkwurịta okwu na sava site na protocol HTTP. Ọmụmaatụ nke ntọala nwere njirimara cleartextTrafficPermitted nwere ihe ọ pụtara 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>

Ọrụ: Wepu nsonaazụ site na aha faịlụ/ụzọ

ngwọta: N'ime otu nnukwu ọrụ metụtara mmepe nke ngwa mkpanaaka maka gam akporo, anyị zutere ihe nhụsianya ụgha nke iwu na-ekpebi ntọala obfuscation. Nke bụ eziokwu bụ na iwu si na igbe ahụ na-achọ na faịlụ ahụ build.gradle ntọala maka itinye iwu mgbochi maka ụdị mwepụta nke ngwa ahụ.

Ma na nnukwu ọrụ mgbe ụfọdụ enwere faịlụ ụmụaka build.gradle, nke na-ezo aka n'ọbá akwụkwọ ndị etinyere na ọrụ ahụ. Ihe dị iche iche bụ na ọ bụrụgodị na faịlụ ndị a egosighi mkpa ọ dị maka obfuscation, a ga-etinye ntọala nke faịlụ mgbakọ nne na nna n'oge nchịkọta.

Ya mere, ọrụ bụ igbuchapụ ihe na-akpali akpali na faịlụ ụmụaka bụ nke ụlọ akwụkwọ. Enwere ike mata ha site na ọnụnọ nke ahịrị apply 'com.android.library'.

Koodu ihe atụ sitere na faịlụ build.gradle, nke na-ekpebi mkpa maka mmechi:

apply plugin: 'com.android.application'

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

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

dependencies {
  ...
}

Ọmụmaatụ faịlụ build.gradle maka ọbá akwụkwọ agụnyere n'ọrụ a nke na-enweghị ntọala a:

apply plugin: 'android-library'

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

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

Na iwu maka Checkmarx:

ProGuardObfuscationNotInJiri

// Поиск метода 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);
		}
	}
}

Usoro a nwere ike bụrụ ihe zuru ụwa ọnụ ma baa uru ọ bụghị naanị maka ngwa gam akporo, kamakwa maka ikpe ndị ọzọ mgbe ịchọrọ ikpebi ma nsonaazụ ya ọ bụ nke otu faịlụ.

Ọrụ: Tinye nkwado maka ọba akwụkwọ ndị ọzọ ma ọ bụrụ na akwadoghị syntax nke ọma

ngwọta: Ọnụọgụ nke usoro dị iche iche nke a na-eji na nhazi koodu ederede dị na chaatị ahụ. N'ezie, Checkmarx adịghị ama mgbe niile banyere ịdị adị ha, na ọrụ anyị bụ ịkụziri ya ịghọta na ụfọdụ ụzọ bụ kpọmkwem nke a kpuchie. Mgbe ụfọdụ, nke a na-agbagwoju anya site n'eziokwu na frameworks na-eji ọrụ aha ndị bụ nnọọ nkịtị na ọ gaghị ekwe omume n'ụzọ doro anya na-ekpebi mmekọrịta nke otu oku na-aga n'ọbá akwụkwọ.

Ihe isi ike bụ na a naghị amata syntax nke ụlọ akwụkwọ ndị dị otú ahụ n'ụzọ ziri ezi na ị ga-anwale iji zere ịnweta ọnụ ọgụgụ buru ibu nke ụgha. Enwere ọtụtụ nhọrọ iji kwalite izi ezi nyocha wee dozie nsogbu ahụ:

  • Nhọrọ mbụ, anyị maara n'ezie na a na-eji ọbá akwụkwọ ahụ mee ihe na otu ọrụ ma nwee ike itinye iwu na ọkwa otu. Ma ọ bụrụ na ndị otu ahụ ekpebie ịme ụzọ dị iche ma ọ bụ jiri ọtụtụ ọba akwụkwọ nke aha ọrụ na-agafe, anyị nwere ike nweta foto na-adịghị mma nke ọtụtụ ihe ngosi ụgha.

  • Nhọrọ nke abụọ bụ ịchọ faịlụ ebe a na-ebubata ọba akwụkwọ n'ụzọ doro anya. Site na usoro a, anyị nwere ike ijide n'aka na a na-eji ọbá akwụkwọ anyị chọrọ na faịlụ a kpọmkwem.

  • Na nhọrọ nke atọ bụ iji ụzọ abụọ a dị n'elu ọnụ.

Dịka ọmụmaatụ, ka anyị leba anya n'ọbá akwụkwọ a maara nke ọma na gburugburu warara slop maka asụsụ mmemme Scala, ya bụ, arụmọrụ Splicing ụkpụrụ nkịtị. Na mkpokọta, iji nyefee paramita na ajụjụ SQL, ị ga-ejirịrị onye ọrụ $, nke na-anọchi data ka ọ bụrụ ajụjụ SQL emebere. Ya bụ, n'ezie, ọ bụ kpọmkwem analogue nke akwadoro nkwupụta na Java. Mana, ọ bụrụ na ịchọrọ ịrụpụta ajụjụ SQL siri ike, dịka ọmụmaatụ, ọ bụrụ na ịchọrọ ịgafe aha tebụl, ịnwere ike iji onye ọrụ. #$, nke ga-anọchi data ozugbo n'ime ajụjụ (fọrọ nke nta ka ọ bụrụ njikọ eriri).

Koodu nlele:

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

Checkmarx amabeghị ka esi achọpụta ojiji Splicing Literal Values ​​na ndị na-arụ ọrụ na-amapụ. #$, ya mere, ka anyị gbalịa ịkụziri ya iji chọpụta injections SQL nwere ike ime ma gosipụta ebe kwesịrị ekwesị na koodu:

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

Ọrụ: Chọọ ọrụ adịghị ike ejiri n'ime ọba akwụkwọ mepere emepe

ngwọta: Ọtụtụ ụlọ ọrụ na-eji ngwa nleba anya Open-Source (OSA omume) iji chọpụta ojiji nke ụdị ọba akwụkwọ adịghị ike na ngwa mepere emepe. Mgbe ụfọdụ, ọ gaghị ekwe omume imelite ụdị ọba akwụkwọ a na ụdị echedoro. N'ọnọdụ ụfọdụ enwere oke ọrụ, na ndị ọzọ enweghị ụdị nchekwa ọ bụla. N'okwu a, nchikota nke omume SAST na OSA ga-enyere aka chọpụta na anaghị eji ọrụ ndị na-eduga na nrigbu nke adịghị ike na koodu.

Ma mgbe ụfọdụ, karịsịa mgbe ị na-atụle Javascript, nke a nwere ike ọ gaghị abụ ọrụ dị ntakịrị. N'okpuru ebe a bụ ngwọta, ikekwe ọ bụghị ezigbo, ma na-arụ ọrụ, na-eji ihe atụ nke vulnerabilities na akụrụngwa. lodash na usoro template и *set.

Ọmụmaatụ nke nwale koodu enweghị ike na faịlụ 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!'

Na mgbe ị na-ejikọ ozugbo na 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>

Anyị na-achọ ụzọ anyị niile adịghị ike, nke edepụtara na adịghị ike:

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

Ọrụ: Na-achọ asambodo agbakwunyere na ngwa ahụ

ngwọta: Ọ bụghị ihe ọhụrụ maka ngwa, ọkachasị ndị mkpanaka, iji asambodo ma ọ bụ igodo iji nweta sava dị iche iche ma ọ bụ nyochaa SSL-Pinning. Site na nchekwa nchekwa, ịchekwa ihe ndị dị otú ahụ na koodu abụghị omume kacha mma. Ka anyị gbalịa dee iwu ga-achọ faịlụ ndị yiri ya na ebe nchekwa:

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

Ọrụ: Ịchọta akara ndị emejọrọ na ngwa ahụ

ngwọta: Ọ na-adị mkpa ka ị kagbuo akara ndị mebiri emebi ma ọ bụ ozi ndị ọzọ dị mkpa dị na koodu ahụ. N'ezie, ịchekwa ha n'ime koodu isi iyi abụghị ezigbo echiche, mana ọnọdụ dịgasị iche iche. N'ihi ajụjụ CxQL, ịchọta ihe ndị dị otú a dị nnọọ mfe:

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

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

nkwubi

Enwere m olileanya na isiokwu a ga-aba uru nye ndị na-amalite ịmara ha na ngwá ọrụ Checkmarx. Ikekwe ndị na-ede iwu nke ha ogologo oge ga-ahụkwa ihe bara uru na ntuziaka a.

O di nwute, enwere ugbua enweghi akụrụngwa ebe enwere ike inweta echiche ohuru n'oge mmepe nke iwu maka Checkmarx. Ọ bụ ya mere anyị ji kee ebe nchekwa na Github, ebe anyị ga-etinye ọrụ anyị ka onye ọ bụla na-eji CxQL nweta ihe bara uru na ya, ma nwee ohere ịkọrọ ndị obodo ọrụ ha. Ebe nchekwa ahụ na-emejupụta na ịhazi ọdịnaya, yabụ a na-anabata ndị ntinye aka!

Gwa anyị ihe ị ga-eme!

isi: www.habr.com

Tinye a comment