Ki jan yo ekri règ pou Checkmarx san yo pa ale fou

Hey Habr!

Nan travay nou an, konpayi nou an trè souvan fè fas ak divès zouti analiz kòd estatik (SAST). Soti nan bwat la yo tout travay mwayèn. Natirèlman, li tout depann sou pwojè a ak teknoloji yo itilize nan li, osi byen ke jan teknoloji sa yo byen kouvri pa règ yo nan analiz. Dapre mwen, youn nan kritè ki pi enpòtan lè w ap chwazi yon zouti SAST se kapasite pou personnaliser li nan espesifikasyon aplikasyon w yo, sètadi, ekri ak chanje règ analiz oswa, jan yo rele yo pi souvan, Custom Queries.

Ki jan yo ekri règ pou Checkmarx san yo pa ale fou

Nou pi souvan itilize Checkmarx - yon analizeur kòd trè enteresan ak pwisan. Nan atik sa a mwen pral pale sou eksperyans mwen nan ekri règ analiz pou li.

Table of Contents

Antre

Pou kòmanse, mwen ta renmen rekòmande youn nan atik yo kèk nan Larisi sou karakteristik yo ki nan rekèt ekri pou Checkmarx. Li te pibliye sou Habré nan fen 2019 anba tit la: "Bonjou, Checkmarx!" Ki jan yo ekri yon rechèch Checkmarx SAST epi jwenn frajilite fre.

Li egzamine an detay ki jan yo ekri premye demann yo nan CxQL (Checkmarx Query Language) pou kèk aplikasyon tès epi li montre prensip debaz yo sou fason règ analiz yo fonksyone.

Mwen pa pral repete sa ki dekri ladan l, byenke kèk entèseksyon ap toujou prezan. Nan atik mwen an mwen pral eseye konpile yon kalite "koleksyon resèt", yon lis solisyon a pwoblèm espesifik ke mwen te rankontre pandan travay mwen ak Checkmarx. Mwen te oblije fè sèvèl mwen sou anpil nan pwoblèm sa yo. Pafwa pa te gen ase enfòmasyon nan dokiman an, epi pafwa li te menm difisil pou konprann ki jan yo fè sa yo te mande yo. Mwen espere eksperyans mwen ak nwit san dòmi pa pral anven, ak "koleksyon resèt Custom Queries" sa a pral sove ou kèk èdtan oswa yon koup nan selil nè. Se konsa, ann kòmanse!

Enfòmasyon jeneral sou règ yo

Premyèman, ann gade kèk konsèp debaz yo ak pwosesis travay ak règ yo, pou yon pi bon konpreyansyon sou sa ki pral rive apre. Epi tou paske dokiman an pa di anyen sou sa a oswa li trè gaye nan estrikti a, ki pa trè pratik.

  1. Règ yo aplike pandan optik depann sou prereglaj la chwazi nan kòmansman an (yon seri règ aktif). Ou ka kreye yon kantite prereglaj san limit, epi egzakteman ki jan yo estriktire yo depann sou spesifik yo nan pwosesis ou a. Ou ka gwoupe yo pa lang oswa chwazi prereglaj pou chak pwojè. Nimewo a nan règ aktif afekte vitès la ak presizyon nan optik.

    Ki jan yo ekri règ pou Checkmarx san yo pa ale fouMete kanpe Prereglaj nan koòdone Checkmarx la

  2. Règ yo modifye nan yon zouti espesyal ki rele CxAuditor. Sa a se yon aplikasyon Desktop ki konekte ak yon sèvè ki kouri Checkmarx. Zouti sa a gen de mòd operasyon: koreksyon règ ak analize rezilta yo nan yon eskanè deja fè.

    Ki jan yo ekri règ pou Checkmarx san yo pa ale fouCxAudit koòdone

  3. Règ nan Checkmarx yo divize pa lang, se sa ki, chak lang gen pwòp seri demann li yo. Genyen tou kèk règ jeneral ki aplike kèlkeswa lang, sa yo se sa yo rele demann debaz yo. Pou pati ki pi, demann debaz yo enplike rechèch pou enfòmasyon ke lòt règ itilize.

    Ki jan yo ekri règ pou Checkmarx san yo pa ale fouDivize règ pa lang

  4. Règ yo se "Egzekite" ak "Ki pa egzekite" (Egzekite ak pa egzekite). Pa byen non kòrèk, nan opinyon mwen, men se sa li ye. Liy anba a se ke rezilta a nan egzekite règ "Egzekitab" yo pral parèt nan rezilta eskanè yo nan UI a, ak règ "Ki pa ekzekitab" yo bezwen sèlman pou itilize rezilta yo nan lòt demann (nan sans, jis yon fonksyon).

    Ki jan yo ekri règ pou Checkmarx san yo pa ale fouDetèmine kalite règ la lè w ap kreye

  5. Ou ka kreye nouvo règ oswa konplete/reekri règ ki deja egziste. Yo nan lòd yo reekri yon règ, ou bezwen jwenn li nan pye bwa a, klike sou dwa epi chwazi "Oblije" nan meni an dewoule. Li enpòtan sonje isit la ke nouvo règ yo pa okòmansman enkli nan prereglaj yo epi yo pa aktif. Pou kòmanse itilize yo, ou bezwen aktive yo nan meni "Manadjè Prereglaj" nan enstriman an. Règ reekri kenbe paramèt yo, se sa ki, si règ la te aktif, li pral rete konsa epi yo pral aplike imedyatman.

    Ki jan yo ekri règ pou Checkmarx san yo pa ale fouEgzanp yon nouvo règ nan koòdone Manadjè Prereglaj la

  6. Pandan ekzekisyon, yon "pye bwa" nan demann yo bati, ki depann de sa. Règ ki kolekte enfòmasyon yo egzekite an premye, ak moun ki sèvi ak li an dezyèm. Rezilta ekzekisyon an kachèt, kidonk si li posib pou itilize rezilta yon règ ki egziste deja, li pi bon pou fè sa, sa ap redwi tan eskanè a.

  7. Règ yo ka aplike nan diferan nivo:

  • Pou sistèm nan tout antye - yo pral itilize pou nenpòt optik nan nenpòt pwojè

  • Nan nivo ekip (Ekip) - yo pral itilize sèlman pou eskane pwojè nan ekip la chwazi a.

  • Nan nivo pwojè - Yo pral aplike nan yon pwojè espesifik

    Ki jan yo ekri règ pou Checkmarx san yo pa ale fouDetèmine nivo nan ki règ la pral aplike

"Diksyonè" pou débutan

Apre sa, mwen pral kòmanse ak kèk bagay ki te lakòz mwen kesyon, epi mwen pral montre tou yon kantite teknik ki pral siyifikativman senplifye lavi.

Operasyon ak lis

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

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

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

Tout atik yo jwenn

Nan lang eskanè a, ou ka jwenn yon lis absoliman tout eleman ke Checkmarx te idantifye (fisèl, fonksyon, klas, metòd, elatriye). Sa a se kèk espas nan objè ki ka jwenn aksè nan All. Sa vle di, pou chèche yon objè ki gen yon non espesifik searchMe, ou ka chèche, pa egzanp, pa non atravè tout objè yo jwenn:

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

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

Men, si ou bezwen fè rechèch nan yon lòt lang ki pou kèk rezon pa te enkli nan eskanè a (pa egzanp, groovy nan yon pwojè android), ou ka elaji espas objè nou an atravè yon varyab:

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

Fonksyon pou analiz Flow

Fonksyon sa yo yo itilize nan anpil règ ak isit la se yon ti fèy tronpe sou sa yo vle di:

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

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

Jwenn non fichye/chemen

Gen plizyè atribi ki ka jwenn nan rezilta yo nan yon rechèch (non an nan dosye a kote yo te jwenn antre a, fisèl, elatriye), men dokiman an pa di ki jan yo jwenn ak itilize yo. Se konsa, nan lòd fè sa, ou bezwen jwenn aksè nan pwopriyete a LinePragma ak objè yo nou bezwen yo pral lokalize andedan li:

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

Li vo kenbe nan tèt ou sa FileName gen aktyèlman chemen an nan dosye a, depi nou te itilize metòd la GetFirstGraph.

Rezilta ekzekisyon

Gen yon varyab espesyal andedan CxQL result, ki retounen rezilta egzekite règ ekri ou a. Li inisyalize imedyatman epi ou ka ekri rezilta entèmedyè nan li, chanje ak rafine yo pandan w ap travay. Men, si pa gen okenn plasman nan varyab sa a oswa fonksyon andedan règ la return— rezilta egzekisyon an ap toujou zewo.

Rekèt sa a pa pral retounen anyen ba nou kòm rezilta nan ekzekisyon epi yo pral toujou vid:

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

Men, lè nou te asiyen rezilta ekzekisyon an nan rezilta varyab majik la, nou pral wè kisa apèl sa a retounen nan nou:

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

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

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

Sèvi ak rezilta yo nan lòt règ

Règ nan Checkmarx yo ka rele analòg ak fonksyon nan yon langaj pwogramasyon regilye. Lè w ap ekri yon règ, ou ka byen sèvi ak rezilta yo nan lòt demann. Pou egzanp, pa gen okenn bezwen pou chèche tout apèl metòd nan kòd la chak fwa, jis rele règ la vle:

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

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

Apwòch sa a pèmèt ou diminye kòd la ak siyifikativman redwi tan an ekzekisyon règ.

Rezoud pwoblèm

Logging

Lè w ap travay ak zouti a, pafwa li pa posib imedyatman ekri rechèch la vle epi ou gen fè eksperyans, eseye opsyon diferan. Pou yon ka konsa, zouti a bay antre, ki rele jan sa a:

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

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

Men, li vo sonje ke metòd sa a sèlman aksepte kòm opinyon fisèl, kidonk li pa pral posib yo montre yon lis konplè nan eleman yo te jwenn kòm yon rezilta nan premye operasyon an. Dezyèm opsyon, ki itilize pou debogaj, se bay yon varyab majik de tan zan tan result rezilta rechèch la epi wè sa k ap pase. Apwòch sa a pa trè pratik; ou bezwen asire w ke pa gen okenn ranvwa oswa operasyon ak sa a nan kòd la apre result oswa tou senpleman kòmante kòd ki anba a. Oswa ou ka, tankou m ', bliye retire plizyè apèl sa yo nan yon règ pare-fè epi mande poukisa pa gen anyen travay.

Yon fason ki pi pratik se rele metòd la return ak paramèt ki nesesè yo. Nan ka sa a, ekzekisyon règ la pral fini epi nou pral kapab wè sa ki te pase kòm rezilta sa nou te ekri:

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

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

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

Pwoblèm konekte

Gen sitiyasyon kote ou pa ka jwenn aksè nan zouti CxAudit (ki itilize pou ekri règ). Kapab genyen anpil rezon pou sa, tankou aksidan, mizajou Windows toudenkou, BSOD ak lòt sitiyasyon enprevi ki depase kontwòl nou an. Nan ka sa a, pafwa gen yon sesyon ki pa fini nan baz done a, ki anpeche w konekte ankò. Pou repare li, ou bezwen kouri plizyè demann:

Pou Checkmarx anvan 8.6:

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

Pou Checkmarx apre 8.6:

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

Règ ekriti yo

Koulye a, nou rive nan pati ki pi enteresan an. Lè ou kòmanse ekri règ nan CxQL, sa ou souvan manke se pa tèlman dokiman kòm kèk egzanp vivan nan rezoud sèten pwoblèm ak dekri pwosesis la nan fason demann travay an jeneral.

Mwen pral eseye rann lavi yon ti kras pi fasil pou moun ki kòmanse plonje nan lang rechèch la epi bay plizyè egzanp sou itilizasyon Custom Queries pou rezoud kèk pwoblèm. Kèk nan yo se byen jeneral epi yo ka itilize nan konpayi ou pratikman san chanjman, lòt moun yo pi espesifik, men yo ka itilize tou lè yo chanje kòd la adapte spesifik aplikasyon ou yo.

Se konsa, isit la yo se pwoblèm yo nou rankontre pi souvan:

Yon travay: Gen plizyè Flow nan rezilta yo nan egzekite règ la ak youn nan yo se yon nidifikasyon nan yon lòt, ou dwe kite youn nan yo.

solisyon: Vreman vre, pafwa Checkmarx montre plizyè koule done ki ka sipèpoze epi yo dwe yon vèsyon pi kout nan lòt moun. Gen yon metòd espesyal pou ka sa yo ReduceFlow. Tou depan de paramèt la, li pral chwazi koule ki pi kout oswa ki pi long:

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

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

Yon travay: Elaji lis done sansib zouti a reyaji

solisyon: Checkmarx gen règ debaz, rezilta yo ki itilize pa anpil lòt demann. Lè w konplete kèk nan règ sa yo ak done espesifik pou aplikasyon w lan, ou ka imedyatman amelyore rezilta eskanè w yo. Anba a se yon egzanp règ pou fè w kòmanse:

General_privacy_violation_list

Ann ajoute plizyè varyab ki itilize nan aplikasyon nou an pou estoke enfòmasyon sansib:

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

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

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

Yon travay: Elaji lis la nan varyab ak modpas

solisyon: Mwen ta rekòmande imedyatman peye atansyon sou règ debaz la pou defini modpas nan kòd epi ajoute nan li yon lis non varyab ki souvan itilize nan konpayi ou.

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

Yon travay: Ajoute kad itilize ki pa sipòte pa Checkmarx

solisyon: Tout demann nan Checkmarx divize pa lang, kidonk ou bezwen ajoute règ pou chak lang. Anba a se kèk egzanp règ sa yo.

Si yo itilize bibliyotèk ki konplete oswa ranplase fonksyonalite estanda yo, yo ka fasilman ajoute yo nan règ debaz la. Lè sa a, tout moun ki sèvi ak li pral imedyatman aprann sou nouvo entwodiksyon yo. Kòm yon egzanp, bibliyotèk pou antre nan android yo se Timber ak Loggi. Nan pake debaz la, pa gen okenn règ pou idantifye apèl ki pa sistèm, kidonk si yon modpas oswa yon idantifyan sesyon antre nan boutèy la, nou pa pral konnen sou li. Ann eseye ajoute definisyon metòd sa yo nan règ Checkmarx yo.

Egzanp kòd tès ki itilize bibliyotèk Timber pou antre:

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

Ak isit la se yon egzanp yon demann pou Checkmarx, ki pral pèmèt ou ajoute yon definisyon rele metòd Timber kòm yon pwen sòti pou done ki soti nan aplikasyon an:

JwennAndroidOutputs

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

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

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

Epi ou ka ajoute tou nan règ vwazen an, men yon sèl sa a gen rapò dirèkteman ak antre nan android:

JwennAndroidLog_Outputs

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

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

Epitou, si aplikasyon android itilize WorkManager pou travay asynchrone, li se yon bon lide anplis enfòme Checkmarx sou sa a lè w ajoute yon metòd pou jwenn done nan travay la. getInputData:

JwennAndroidLi

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

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

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

Yon travay: Chèche done sansib nan plist pou pwojè iOS

solisyon: iOS souvan itilize fichye espesyal ak ekstansyon .plist pou sere divès kalite varyab ak valè. Sere modpas, marqueur, kle ak lòt done sansib nan dosye sa yo pa rekòmande, paske yo ka ekstrè nan aparèy la san okenn pwoblèm.

Fichye Plist yo gen karakteristik ki pa evidan nan je toutouni, men yo enpòtan pou Checkmarx. Ann ekri yon règ ki pral chèche done nou bezwen yo epi di nou si modpas oswa siy yo mansyone yon kote.

Yon egzanp yon dosye konsa, ki gen yon siy pou kominikasyon ak sèvis backend la:

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

Ak yon règ pou Checkmarx, ki gen plizyè nuans ki ta dwe pran an kont lè w ap ekri:

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

Yon travay: Jwenn enfòmasyon nan XML

solisyon: Checkmarx gen fonksyon trè pratik pou travay ak XML ak pou chèche valè, tags, atribi ak plis ankò. Men, malerezman, te gen yon erè nan dokiman an akòz ki pa yon sèl egzanp travay. Malgre lefèt ke domaj sa a te elimine nan dènye vèsyon an nan dokiman an, fè atansyon si ou itilize vèsyon pi bonè nan dokiman yo.

Men yon egzanp kòrèk nan dokiman an:

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

Kòm yon rezilta tantativ ekzekisyon an, nou pral resevwa yon erè sa All pa gen okenn metòd sa a... Epi sa a se vre, depi gen yon espas espesyal, separe objè pou itilize fonksyon pou travay ak XML - cxXPath. Men sa rechèch ki kòrèk la sanble pou jwenn yon anviwònman nan Android ki pèmèt itilizasyon trafik HTTP:

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

Ann gade sou li nan yon ti kras plis detay, depi sentaks la pou tout fonksyon se menm jan an, apre ou fin kalkile youn, Lè sa a, ou jis bezwen chwazi youn nan ou bezwen an. Se konsa, sekans dapre paramèt yo:

  • "*.xml"- mask nan dosye yo dwe fouye

  • 8 — id nan lang pou ki règ la aplike

  • "cleartextTrafficPermitted"- non atribi nan xml

  • "true" - valè atribi sa a

  • false — itilize ekspresyon regilye lè w ap chèche

  • true — vle di ke rechèch la pral fèt inyore ka, se sa ki, ka-sensib

Kòm yon egzanp, nou itilize yon règ ki idantifye kòrèk, nan yon pwen de vi sekirite, anviwònman koneksyon rezo nan Android ki pèmèt kominikasyon ak sèvè a atravè pwotokòl la HTTP. Egzanp yon anviwònman ki gen yon atribi cleartextTrafficPermitted ak siyifikasyon 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>

Yon travay: Limite rezilta yo pa non fichye/chemen

solisyon: Nan youn nan pwojè yo gwo ki gen rapò ak devlopman nan yon aplikasyon mobil pou android, nou te rankontre fo pozitif nan règ la ki detèmine anviwònman an obfuscation. Reyalite a se ke règ la soti nan rechèch la bwat nan dosye a build.gradle yon anviwònman ki responsab pou aplike règ ofiskasyon pou vèsyon an lage aplikasyon an.

Men, nan gwo pwojè pafwa gen dosye timoun build.gradle, ki refere a bibliyotèk ki enkli nan pwojè a. Singularité a se ke menm si fichye sa yo pa endike nesesite pou ofiskasyon, anviwònman yo nan dosye asanble paran yo pral aplike pandan konpilasyon.

Kidonk, travay la se koupe deklanche nan dosye timoun ki fè pati bibliyotèk. Yo ka idantifye pa prezans nan liy lan apply 'com.android.library'.

Egzanp kòd ki soti nan dosye a build.gradle, ki detèmine nesesite pou obfuscation:

apply plugin: 'com.android.application'

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

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

dependencies {
  ...
}

Egzanp dosye build.gradle pou yon bibliyotèk ki enkli nan pwojè a ki pa gen anviwònman sa a:

apply plugin: 'android-library'

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

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

Ak règ la pou Checkmarx:

ProGuardObfuscationNotInUse

// Поиск метода release среди всех методов в Gradle файлах
CxList releaseMethod = Find_Gradle_Method("release");

// Все объекты из файлов build.gradle
CxList gradleBuildObjects = Find_Gradle_Build_Objects();

// Поиск того, что находится внутри метода "release" среди всех объектов из файлов build.gradle
CxList methodInvokesUnderRelease = gradleBuildObjects.FindByType(typeof(MethodInvokeExpr)).GetByAncs(releaseMethod);

// Ищем внутри gradle-файлов строку "com.android.library" - это значит, что данный файл относится к библиотеке и его необходимо исключить из правила
CxList android_library = gradleBuildObjects.FindByName("com.android.library");

// Инициализация пустого массива
List<string> libraries_path = new List<string> {};

// Проходим через все найденные "дочерние" файлы
foreach(CxList library in android_library)
{
    // Получаем путь к каждому файлу
	string file_name_library = library.GetFirstGraph().LinePragma.FileName;
    
    // Добавляем его в наш массив
	libraries_path.Add(file_name_library);
}

// Ищем все вызовы включения обфускации в релизных настройках
CxList minifyEnabled = methodInvokesUnderRelease.FindByShortName("minifyEnabled");

// Получаем параметры этих вызовов
CxList minifyValue = gradleBuildObjects.GetParameters(minifyEnabled, 0);

// Ищем среди них включенные
CxList minifyValueTrue = minifyValue.FindByShortName("true");

// Немного магии, если не нашли стандартным способом :D
if (minifyValueTrue.Count == 0) {
	minifyValue = minifyValue.FindByAbstractValue(abstractValue => abstractValue is TrueAbstractValue);
} else {
    // А если всё-таки нашли, то предыдущий результат и оставляем
	minifyValue = minifyValueTrue;	
}

// Если не нашлось таких методов
if (minifyValue.Count == 0)
{
    // Для более корректного отображения места срабатывания в файле ищем или buildTypes или android
	CxList tempResult = All.NewCxList();
	CxList buildTypes = Find_Gradle_Method("buildTypes");
	if (buildTypes.Count > 0) {
		tempResult = buildTypes;
	} else {
		tempResult = Find_Gradle_Method("android");
	}
	
	// Для каждого из найденных мест срабатывания проходим и определяем, дочерний или основной файлы сборки
	foreach(CxList res in tempResult)
	{
        // Определяем, в каком файле был найден buildType или android методы
		string file_name_result = res.GetFirstGraph().LinePragma.FileName;
        
        // Если такого файла нет в нашем списке "дочерних" файлов - значит это основной файл и его можно добавить в результат
		if (libraries_path.Contains(file_name_result) == false){
			result.Add(res);
		}
	}
}

Apwòch sa a ka byen inivèsèl ak itil pa sèlman pou aplikasyon android, men tou pou lòt ka lè ou bezwen detèmine si yon rezilta fè pati yon dosye espesifik.

Yon travay: Ajoute sipò pou yon bibliyotèk twazyèm pati si sentaks la pa konplètman sipòte

solisyon: Nimewo a nan kad divès kalite ke yo itilize nan pwosesis la nan ekri kòd se tou senpleman koupe tablo yo. Natirèlman, Checkmarx pa toujou konnen sou egzistans yo, ak travay nou an se anseye li yo konprann ke sèten metòd fè pati espesifikman nan kad sa a. Pafwa sa a konplike pa lefèt ke kad yo sèvi ak non fonksyon ki trè komen epi li enposib detèmine san anbigwite relasyon yon apèl patikilye ak yon bibliyotèk espesifik.

Difikilte a se ke sentaks nan bibliyotèk sa yo pa toujou rekonèt kòrèkteman epi ou dwe fè eksperyans pou evite jwenn yon gwo kantite fo pozitif. Gen plizyè opsyon pou amelyore presizyon optik ak rezoud pwoblèm nan:

  • Premye opsyon a, nou konnen pou asire w ke bibliyotèk la itilize nan yon pwojè espesifik epi yo ka aplike règ la nan nivo ekip la. Men, si ekip la deside pran yon apwòch diferan oswa itilize plizyè bibliyotèk kote non fonksyon sipèpoze, nou ka jwenn yon foto pa trè bèl nan anpil fo pozitif.

  • Dezyèm opsyon a se pou chèche fichye kote bibliyotèk la enpòte klèman. Avèk apwòch sa a, nou ka asire w ke bibliyotèk nou bezwen an egzakteman itilize nan dosye sa a.

  • Ak twazyèm opsyon a se sèvi ak de apwòch ki anwo yo ansanm.

Kòm yon egzanp, an n gade nan yon bibliyotèk byen li te ye nan ti sèk etwat Slick pou langaj pwogram Scala, sètadi, fonksyonalite a Splicing Valè Literal. An jeneral, pou pase paramèt nan yon rechèch SQL, ou dwe itilize operatè a $, ki ranplase done nan yon rechèch SQL prefòme. Sa se, an reyalite, li se yon analogue dirèk nan Deklarasyon Prepare nan Java. Men, si ou bezwen dinamikman konstwi yon rechèch SQL, pou egzanp, si ou bezwen pase non tab, ou ka itilize operatè a. #$, ki pral dirèkteman ranplase done yo nan rechèch la (prèske tankou konkatènasyon fisèl).

Egzanp kòd:

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

Checkmarx poko konnen ki jan yo detekte itilizasyon Splicing Literal Values ​​ak sote operatè yo #$, Se konsa, ann eseye anseye li yo idantifye potansyèl piki SQL ak mete aksan sou kote ki dwat nan kòd la:

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

Yon travay: Chèche fonksyon vilnerab yo itilize nan bibliyotèk Open-Source

solisyon: Anpil konpayi itilize zouti siveyans Open-Source (OSA practice) pou detekte itilizasyon vèsyon vilnerab bibliyotèk yo nan aplikasyon devlope yo. Pafwa li pa posib mete ajou yon bibliyotèk sa a nan yon vèsyon an sekirite. Nan kèk ka gen limit fonksyonèl, nan lòt moun pa gen okenn vèsyon ki an sekirite nan tout. Nan ka sa a, yon konbinezon de pratik SAST ak OSA pral ede detèmine ke fonksyon ki mennen nan eksplwatasyon vilnerabilite a pa itilize nan kòd la.

Men pafwa, espesyalman lè w ap konsidere JavaScript, sa a ka pa yon travay konplètman trivial. Anba a se yon solisyon, petèt pa ideyal, men kanmenm k ap travay, lè l sèvi avèk egzanp frajilite nan eleman an. lodash nan metòd template и *set.

Men kèk egzanp sou kòd tès potansyèlman vilnerab nan yon dosye 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!'

Epi lè w konekte dirèkteman nan 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>

Nou ap chèche pou tout metòd vilnerab nou yo, ki nan lis frajilite yo:

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

Yon travay: Chèche sètifika ki entegre nan aplikasyon an

solisyon: Li pa estraòdinè pou aplikasyon, sitou sa ki mobil, sèvi ak sètifika oswa kle pou jwenn aksè nan divès sèvè oswa verifye SSL-Pinning. Soti nan yon pèspektiv sekirite, estoke bagay sa yo nan kòd se pa pi bon pratik la. Ann eseye ekri yon règ ki pral chèche dosye ki sanble nan repozitwa a:

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

Yon travay: Jwenn siy konpwomèt nan aplikasyon an

solisyon: Li souvan nesesè pou anile marqueur konpwomèt oswa lòt enfòmasyon enpòtan ki prezan nan kòd la. Natirèlman, estoke yo andedan kòd sous la se pa yon bon lide, men sitiyasyon yo varye. Mèsi a demann CxQL, jwenn bagay sa yo se byen fasil:

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

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

Konklizyon

Mwen espere ke atik sa a pral itil pou moun ki kòmanse fè konesans ak zouti Checkmarx la. Petèt moun ki te ekri pwòp règ yo pou yon tan long ap jwenn tou yon bagay itil nan gid sa a.

Malerezman, kounye a gen yon mank de yon resous kote nouvo lide yo ka ranmase pandan devlopman nan règ pou Checkmarx. Se poutèt sa nou te kreye depo sou Github, kote nou pral poste travay nou an pou tout moun ki sèvi ak CxQL ka jwenn yon bagay itil ladan l, epi tou gen opòtinite pou pataje travay yo ak kominote a. Repozitwa a se nan pwosesis pou ranpli ak estriktire kontni, kidonk kontribitè yo akeyi!

Mèsi pou atansyon ou!

Sous: www.habr.com

Add nouvo kòmantè