Sida loo qoro xeerarka Checkmarx oo aanad waalan

Haye Habr!

Shaqadeena, shirkadeena waxay inta badan la macaamishaa aaladaha falanqaynta koodhka ee kala duwan (SAST). Marka laga reebo sanduuqa dhammaantood waxay shaqeeyaan celcelis ahaan. Dabcan, wax walba waxay ku xiran yihiin mashruuca iyo teknoolajiyada loo isticmaalo, iyo sidoo kale sida ugu wanaagsan ee tiknoolajiyadani ay u daboolaan xeerarka falanqaynta. Fikradayda, mid ka mid ah shuruudaha ugu muhiimsan marka la dooranayo qalabka SAST waa awoodda aad u habeyn karto siyaabaha gaarka ah ee codsiyadaada, kuwaas oo ah, qorista iyo beddelka xeerarka falanqaynta ama, sida inta badan loogu yeero, Su'aalaha Custom.

Sida loo qoro xeerarka Checkmarx oo aanad waalan

Inta badan waxaan isticmaalnaa Checkmarx - kood aad u xiiso badan oo awood badan leh. Maqaalkan waxaan kaga hadli doonaa waayo-aragnimadayda qorista xeerarka falanqaynta.

Tusmada

entry

Si aan ku bilaabo, waxaan jeclaan lahaa inaan ku taliyo mid ka mid ah dhowrka maqaallo oo Ruush ah oo ku saabsan sifooyinka qorista weydiimaha ee Checkmarx. Waxaa lagu daabacay Habré dhamaadkii 2019 iyadoo cinwaankeedu yahay: "Hello, Checkmarx!" Sida loo qoro weydiimaha Checkmarx SAST oo aad u hesho baylahda wanaagsan.

Waxay si faahfaahsan u baadhaysaa sida loogu qoro weydiimaha ugu horreeya CxQL (Checkmarx Query Language) ee codsiyada imtixaannada qaarkood oo waxay tusinaysaa mabaadi'da aasaasiga ah ee sida xeerarka falanqayntu u shaqeeyaan.

Ku soo celin maayo wixii lagu sheegay, inkastoo isgoysyada qaar ay weli jiraan. Maqaalkayga waxaan isku dayi doonaa inaan ururiyo nooc ka mid ah "ururinta cuntooyinka", liiska xalalka dhibaatooyinka gaarka ah ee aan la kulmay intii aan shaqaynayey Checkmarx. Waxaan ku qasbanaay in aan maskaxdayda ka qaado dhibaatooyin badan oo ka mid ah. Mararka qaarkood ma jirin xog ku filan dukumentiyada, mararka qaarkoodna way adkeyd in la fahmo sida loo sameeyo waxa loo baahan yahay. Waxaan rajeynayaa in waayo-aragnimadayda iyo habeennada hurdo-la'aanta ahi aanay noqon doonin wax aan micne lahayn, iyo "ururinta cuntooyinka su'aalaha caadiga ah" waxay ku badbaadin doontaa dhowr saacadood ama dhowr unug oo neerfaha ah. Markaa, aan bilowno!

Macluumaadka guud ee xeerarka

Marka hore, aan eegno dhowr fikradood oo aasaasi ah iyo habka loo shaqeeyo xeerarka, si loo fahmo waxa xiga ee dhici doona. Iyo sidoo kale sababtoo ah dukumeentigu waxba kama odhan arrintan ama aad bay ugu faafeen qaab-dhismeedka, taas oo aan ku habboonayn.

  1. Xeerarka waxaa lagu dabaqaa inta lagu guda jiro iskaanka iyadoo ku xiran habka hore loo doortay ee bilowga ah (xeerar sharciyo firfircoon). Waxaad samayn kartaa tiro aan xadidnayn oo horudhac ah, iyo sida saxda ah ee loo qaabeeyo waxay kuxirantahay waxyaabaha gaarka ah ee habkaaga. Waxaad ku kooxeyn kartaa luqad ahaan ama waxaad dooran kartaa mashruuc kasta. Tirada xeerarka firfircoon waxay saameeyaan xawaaraha iyo saxnaanta sawirka.

    Sida loo qoro xeerarka Checkmarx oo aanad waalanDejinta Preset gudaha Checkmarx interface

  2. Xeerarka waxaa lagu tafatiray qalab gaar ah oo la yiraahdo CxAuditor. Kani waa codsi desktop ah oo ku xidha server-ka ku shaqeeya Checkmarx. Qalabkani waxa uu leeyahay laba qaab oo hawleed: xeerarka tafatirka iyo falanqaynta natiijada iskaanka hore loo sameeyay.

    Sida loo qoro xeerarka Checkmarx oo aanad waalanCxAudit interface

  3. Xeerarka ku jira Checkmarx waxaa loo qaybiyaa luqad, taas oo ah, luqad kastaa waxay leedahay su'aalo u gaar ah. Waxa kale oo jira xeerar guud oo khuseeya luqad kasta, kuwaas waa waxa loogu yeero weydiimaha aasaasiga ah. Inta badan, weydiimaha aasaasiga ah waxay ku lug leeyihiin raadinta macluumaadka ay isticmaalaan sharciyada kale.

    Sida loo qoro xeerarka Checkmarx oo aanad waalanXeerarka oo lagu qaybsado luqad

  4. Xeerarku waa “La Fulin Karo” iyo “Lama Fulin Karo” (Lama Fulin) Ma ahan magaca saxda ah, fikradeyda, laakiin taasi waa waxa uu yahay. Xariiqda hoose ayaa ah in natiijada fulinta xeerarka "Flin la fulin karo" lagu soo bandhigi doono natiijooyinka iskaanka ee UI, iyo xeerarka "aan la fulin karin" ayaa loo baahan yahay oo kaliya si loogu isticmaalo natiijooyinkooda codsiyada kale (xaqiiqda, waxay yihiin uun shaqo. ).

    Sida loo qoro xeerarka Checkmarx oo aanad waalanGo'aaminta nooca qaanuunka marka la abuurayo

  5. Waxaad abuuri kartaa sharciyo cusub ama ku kordhin kartaa/dib u qori kartaa kuwa jira. Si aad dib ugu qorto qaanuunka, waxaad u baahan tahay inaad ka heshid geedka, midig-guji oo dooro "Ka noqo" menu-hoosaadka. Waa muhiim in halkan lagu xasuusto in xeerarka cusub aan markii hore lagu darin presets oo aan firfircoonayn. Si aad u bilowdo isticmaalkooda waxa aad u baahantahay in aad ka shaqaysiiso liiska "Maareeyaha Preset" ee qalabka. Xeerarka dib loo qoray ayaa sii hayn doona goobahooda, taasi waa, haddii sharcigu shaqaynayo, wuu ahaan doonaa oo isla markiiba waa la dabaqi doonaa.

    Sida loo qoro xeerarka Checkmarx oo aanad waalanTusaalaha sharciga cusub ee interface Manager Preset

  6. Inta lagu jiro fulinta, "geed" codsiyada ayaa la dhisay, taas oo ku xiran waxa. Xeerarka xog ururinta ayaa marka hore la fuliyaa, kuwa isticmaalana labaad. Natiijada fulinta waa la kaydiyay, markaa haddii ay suurtagal tahay in la isticmaalo natiijooyinka qaanuunka jira, markaa way fiicantahay in la sameeyo, tani waxay yaraynaysaa wakhtiga sawirka.

  7. Xeerarka waxaa lagu dabaqi karaa heerar kala duwan:

  • Nidaamka oo dhan - waxaa loo isticmaali doonaa sawir kasta oo mashruuc kasta ah

  • Heerka kooxda (Kooxda) - waxa kaliya loo isticmaali doonaa in lagu sawiro mashaariicda kooxda la doortay.

  • Heerka mashruuca - Waxaa lagu dabaqi doonaa mashruuc gaar ah

    Sida loo qoro xeerarka Checkmarx oo aanad waalanGo'aaminta heerka sharciga lagu dabaqi doono

"Qaamuuska" bilawga

Oo waxaan ku bilaabi doonaa dhowr waxyaalood oo su'aalo igu dhaliyay, sidoo kale waxaan tusi doonaa farsamooyin dhowr ah oo si weyn u fududayn doona nolosha.

Hawlgallada liisaska leh

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

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

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

Dhammaan alaabta la helay

Gudaha luqadda la sawiray, waxaad ka heli kartaa liis gabi ahaanba dhammaan walxaha uu Checkmarx aqoonsaday (xadhkaha, shaqooyinka, fasallada, hababka, iwm.). Tani waa meel bannaan oo walxaha laga dhex geli karo All. Taasi waa, in la raadiyo shay leh magac gaar ah searchMe, waxaad ka raadin kartaa, tusaale ahaan, magaca dhammaan walxaha la helay:

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

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

Laakiin, haddii aad u baahan tahay inaad ku raadiso luqad kale oo aan lagu darin skaanka (tusaale, groovy ee mashruuca Android), waxaad ku ballaarin kartaa booska shayga adigoo isticmaalaya doorsoome:

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

Hawlaha falanqaynta socodka

Hawlahan waxaa loo adeegsadaa sharciyo badan waxaana halkan ku yaal xaashi yar oo khiyaamo ah oo macnaheedu yahay:

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

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

Helitaanka magaca faylka/dariiqa

Waxaa jira dhowr astaamood oo laga heli karo natiijada weydiinta (magaca faylka laga helay gelitaanka, xargaha, iwm.), laakiin dukumeentigu ma sheegayo sida loo helo oo loo isticmaalo. Markaa, si tan loo sameeyo, waxaad u baahan tahay inaad gasho hantida LinePragma, walxaha aan u baahanahayna waxay ku yaalliin gudaha:

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

Waxaa haboon in maskaxda lagu hayo taas FileName ka kooban dhab ahaantii jidka loo maro faylka, maadaama aan isticmaalnay habka GetFirstGraph.

Natiijada fulinta

Waxaa jira doorsoome gaar ah gudaha CxQL result, kaas oo soo celinaya natiijada fulinta sharcigaaga qoran. Isla markiiba waa la bilaabay oo waxaad ku qori kartaa natiijooyin dhexdhexaad ah, beddelo oo aad sifayso markaad shaqaynayso. Laakiin, haddii aysan jirin meeleyn doorsoomahan ama shaqada gudaha sharciga return- natiijadu waxay mar walba noqon doontaa eber.

Weydiinta soo socota waxba nooma soo celin doonto natiijada fulinta oo had iyo jeer waxay ahaan doontaa faaruq:

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

Laakin, anagoo u xilsaarnay natiijada fulinta natiijada doorsoomiyaha sixirka, waxaan arki doonaa waxa wicitaankan nagu soo noqda:

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

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

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

Isticmaalka natiijooyinka xeerarka kale

Xeerarka ku jira Checkmarx waxa loogu yeedhi karaa kuwo la mid ah shaqooyinka luuqada barnaamijyada caadiga ah. Markaad qorayso sharci, waxaad si fiican u isticmaali kartaa natiijooyinka weydiimaha kale. Tusaale ahaan, looma baahna in la raadiyo dhammaan wicitaannada habka ee koodka mar kasta, kaliya wac xeerka la rabo:

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

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

Habkani wuxuu kuu ogolaanayaa inaad soo gaabiyo koodka oo aad si weyn u yareyso wakhtiga fulinta sharciga.

Xalinta dhibaatada

Goynta

Markaad la shaqeyneyso qalabka, mararka qaarkood suurtagal maaha in isla markiiba la qoro su'aalaha la rabo waana inaad tijaabisaa, isku day inaad tijaabiso doorashooyin kala duwan. Xaaladdan oo kale, qalabku wuxuu bixiyaa gooyn, kaas oo loo yaqaan sida soo socota:

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

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

Laakiin waxaa habboon in la xasuusto in habkani uu aqbalo oo kaliya sida wax-is-dhexgalka xadhig, sidaas darteed suurtagal ma noqon doonto in la soo bandhigo liis dhamaystiran oo ah walxaha la helay natiijada qalliinka ugu horreeya. Doorashada labaad, oo loo isticmaalo wax-ka-hortagga, waa in lagu meeleeyo doorsoomiyaha sixirka waqti ka waqti result natiijada weydiinta oo arag waxa dhaca. Habkani maaha mid ku habboon; waxaad u baahan tahay inaad hubiso inaysan jirin wax ka-hortagga ama hawlgallada tan ku jira koodka ka dib result ama si fudud uga faallooda koodka hoose. Ama waad, aniga oo kale, ilowdaa inaad ka saarto dhowr wicitaan oo noocaas ah xeer diyaarsan oo aad la yaabto sababta aysan waxba u shaqayn.

Habka ugu habboon waa in la waco habka return oo leh cabbirka loo baahan yahay. Xaaladdan oo kale, fulinta xeerku wuu dhammaanayaa, waxaana arki doonnaa wixii dhacay ee ka dhashay qoraalkan:

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

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

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

Dhibaatada soo galitaanka

Waxaa jira xaalado marka aadan heli karin qalabka CxAudit (kaas oo loo isticmaalo in lagu qoro xeerarka). Waxaa jiri kara sababo badan oo tan ah, oo ay ku jiraan shilalka, cusbooneysiinta degdega ah ee Windows, BSOD iyo xaalado kale oo aan la filayn oo ka baxsan xakamayntayada. Xaaladdan oo kale, mararka qaarkood waxaa jira fadhi aan dhammaanayn ee kaydka, kaas oo kaa ilaalinaya inaad mar kale gasho. Si aad u xalliso, waxaad u baahan tahay inaad samayso dhawr su'aalood:

Checkmarx ka hor 8.6:

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

Wixii Checkmarx ka dib 8.6:

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

Xeerarka qorista

Hadda waxaynu gaadhnay qaybtii ugu xiisaha badnayd. Markaad bilowdo inaad ku qorto xeerarka CxQL, waxa aad inta badan ka maqan tahay dukumeenti aad u badan maaha tusaaleyaal nool oo xalinta dhibaatooyinka qaarkood iyo sharaxaadda habka sida su'aalaha u shaqeeyaan guud ahaan.

Waxaan isku dayi doonaa inaan nolosha u yara fududeeyo kuwa bilaabaya inay ku dhex dhuuntaan luuqada waydiinta oo aan bixiyo dhawr tusaale oo ku saabsan adeegsiga Su'aalaha Caadiga ah si loo xalliyo dhibaatooyinka qaarkood. Qaarkood waa kuwo guud waxaana loo isticmaali karaa shirkaddaada si ficil ah iyada oo aan isbeddelin, kuwa kale waa kuwo gaar ah, laakiin sidoo kale waxaa loo isticmaali karaa in la beddelo koodka si loo waafajiyo waxyaabaha gaarka ah ee codsiyadaada.

Haddaba, waa kuwan dhibaatooyinka aan inta badan la kulanno:

Hawl: Waxaa jira dhowr qulqulo natiijooyinka fulinta qaanuunka oo mid ka mid ah waa buul kale, waa inaad ka tagtaa mid ka mid ah.

xal: Runtii, mararka qaarkood Checkmarx waxa ay muujisaa dhawr xog oo qulqulaya oo laga yaabo inay is dul saaran yihiin oo noqdaan nooc kuwa kale ah oo la soo gaabiyo. Waxaa jira hab gaar ah oo kiisaska noocaas ah Iska yaree socodka Iyadoo ku xiran halbeegga, waxay dooran doontaa socodka ugu gaaban ama ugu dheer:

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

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

Hawl: Kordhi liiska xogta xasaasiga ah ee qalabku ka falceliyo

xal: Checkmarx waxay leedahay xeerar aasaasi ah, kuwaas oo natiijadooda ay adeegsadaan su'aalo kale oo badan. Markaad ku kabto qaar ka mid ah sharciyadan xogta gaarka ah ee codsigaaga, waxaad isla markiiba hagaajin kartaa natiijooyinkaaga iskaanka. Hoos waxaa ku yaal xeer tusaale ah oo ku bilaabaya:

Liis_xadgudub_guud_qarsoodi

Aan ku darno doorsoomayaal dhowr ah oo loo isticmaalo codsigayaga si loo kaydiyo macluumaadka xasaasiga ah:

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

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

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

Hawl: Ku fidi liiska doorsoomayaasha sirta ah

xal: Waxaan ku talin lahaa in aad isla markiiba fiiro gaar ah u yeelato xeerka aasaasiga ah ee qeexida ereyada sirta ah ee koodka oo aad ku darto liiska magacyada doorsooma ee sida caadiga ah loo isticmaalo shirkaddaada.

Liis_gudbiyeedka_password_privacy

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

Hawl: Ku dar qaab-dhismeedka la isticmaalay ee aanuu taageereynin Checkmarx

xal: Dhammaan weydiimaha ku jira Checkmarx waxaa loo qaybiyaa luqad, marka waxaad u baahan tahay inaad ku darto xeerar luqad kasta. Hoos waxaa ku yaal tusaalooyin xeerar ah.

Haddii maktabadaha loo isticmaalo kuwa buuxinaya ama beddelaya shaqada caadiga ah, si fudud ayaa loogu dari karaa xeerka aasaasiga ah. Markaa qof kasta oo isticmaala wuxuu isla markiiba baran doonaa hordhacyada cusub. Tusaale ahaan, maktabadaha lagu galo Android waa Timber iyo Loggi. Xirmada aasaasiga ah, ma jiraan xeerar lagu aqoonsanayo wicitaannada aan nidaamka ahayn, markaa haddii erayga sirta ah ama aqoonsiga fadhiga uu galo log, garan mayno. Aynu isku dayno inaan ku darno qeexitaannada hababka noocaas ah xeerarka Checkmarx.

Tijaabi tusaalaha koodka ee isticmaala maktabadda alwaaxa si loo soo galiyo:

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

Oo halkan waa tusaale codsi Checkmarx ah, kaas oo kuu oggolaan doona inaad ku darto qeexida wacitaanka hababka Timber-ka oo ah meel looga baxo xogta codsiga:

HelAndroidOutputs

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

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

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

Waxaad sidoo kale ku dari kartaa xeerka deriska, laakiin kani wuxuu si toos ah ula xiriiraa gelitaanka Android:

Soo hel AndroidLog_outputs

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

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

Sidoo kale, haddii codsiyada Android ay isticmaalaan Maamulaha Shaqada shaqada asynchronous, waa fikrad wanaagsan in lagu daro Checkmarx wax ku saabsan tan adoo ku daraya hab lagu helo xogta hawsha getInputData:

FindAndroidRead

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

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

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

Hawl: Raadinta xogta xasaasiga ah ee liiska mashaariicda iOS

xal: IOS inta badan waxay isticmaashaa faylal gaar ah oo wata .plist kordhinta si ay u kaydiso doorsoomayaal iyo qiimayaal kala duwan. Kaydinta furayaasha sirta ah, calaamadaha, furayaasha iyo xogta kale ee xasaasiga ah ee faylalkan laguma talinayo, sababtoo ah waxaa laga soo saari karaa qalabka iyada oo aan wax dhibaato ah la kulmin.

Faylasha Plist waxay leeyihiin astaamo aan si cad u muuqan indhaha qaawan, laakiin waxay muhiim u yihiin Checkmarx. Aan qorno sharci raadin doona xogta aan u baahanahay oo noo sheeg haddii furaha ama calaamadaha lagu sheego meel.

Tusaalaha faylka noocaas ah, oo ka kooban calaamad muujinaysa xidhiidhka adeegga dhabarka:

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

Iyo qaanuunka Checkmarx, kaas oo leh dhowr nuances oo ay tahay in la tixgeliyo marka la qorayo:

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

Hawl: Helitaanka macluumaadka XML

xal: Checkmarx waxa uu leeyahay hawlo ku haboon la shaqaynta XML iyo raadinta qiyamka, summada, sifooyinka iyo wax ka badan. Laakiin, nasiib darro, waxaa jiray khalad dukumeentigu taas oo ay sabab u tahay hal tusaale oo aan shaqaynayn. In kasta oo xaqiiqda ah in ciladdan lagu tirtiray nuqulkii ugu dambeeyay ee dukumentiga, ka taxaddar haddii aad isticmaasho nuqulkii hore ee dukumentiyada.

Waa kan tusaale khaldan oo ka yimid dukumeentiyada:

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

Natiijada isku dayga dilka, waxaan heli doonaa qalad kaas All Ma jiro habkan oo kale ... Tani waa run, maadaama ay jirto meel gaar ah, shay gaar ah oo loogu talagalay isticmaalka hawlaha la shaqeynta XML - cxXPath. Tani waa waxa su'aasha saxda ah ay u egtahay in laga helo goobta Android oo u oggolaanaysa isticmaalka HTTP taraafikada:

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

Aynu si faahfaahsan u eegno, maadaama syntax ee dhammaan hawlaha ay isku mid yihiin, ka dib markaad mid ka mid ah, ka dibna kaliya waxaad u baahan tahay inaad doorato midka aad u baahan tahay. Markaa, si isdaba joog ah iyadoo loo eegayo xuduudaha:

  • "*.xml"- maaskaro galalka la baadho

  • 8 - id ee luqadda qaanuunka lagu dabaqay

  • "cleartextTrafficPermitted"- magaca sifo xml

  • "true" - qiimaha sifadan

  • false - isticmaalka odhaah joogto ah marka la raadinayo

  • true - macnaheedu waa in raadinta la samayn doono iyada oo la iska indho-tiray kiis, taas oo ah, kiis aan dareen lahayn

Tusaale ahaan, waxaan isticmaalnay sharci tilmaamaya khalad, marka laga eego dhanka amniga, goobaha isku xirka isku xirka Android ee u oggolaanaya xiriirka serverka iyada oo loo marayo borotokoolka HTTP. Tusaale goob ka kooban sifo cleartextTrafficPermitted macne leh 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>

Hawl: Ku xaddid natiijooyinka magaca faylka

xal: Mid ka mid ah mashaariicda waaweyn ee la xidhiidha horumarinta codsiga mobaylka ee Android, waxaanu la kulannay waxyaabo been abuur ah oo qaanuunka ah kaas oo go'aaminaya goobta qarsoodiga ah. Xaqiiqdu waxay tahay in xeerka ka baxsan sanduuqa uu baadho faylka build.gradle goob mas'uul ka ah in lagu dabaqo qawaaniinta qarsoodiga ah ee nooca siideynta codsiga.

Laakiin mashaariicda waaweyn mararka qaarkood waxaa jira faylal caruureed build.gradle, kuwaas oo tixraacaya maktabadaha ku jira mashruuca. Xaqiiqdu waxay tahay in xitaa haddii faylashani aysan muujin baahida daboolka, dejinta faylka kulanka waalidka ayaa lagu dabaqi doonaa inta lagu jiro ururinta.

Markaa, hawshu waa in la gooyo kiciyeyaasha ku jira faylalka carruurta ee ay leeyihiin maktabadaha. Waxaa lagu aqoonsan karaa joogitaanka khadka apply 'com.android.library'.

Tusaalaha koodka faylka build.gradle, kaas oo go'aaminaya baahida daboolka:

apply plugin: 'com.android.application'

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

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

dependencies {
  ...
}

Tusaalaha faylka build.gradle maktabadda lagu daray mashruuca oo aan lahayn goobtan:

apply plugin: 'android-library'

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

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

Iyo qaanuunka Checkmarx:

ProGuardObfuscationNotInIsticmaalka

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

Habkani wuxuu noqon karaa mid caalami ah oo faa'iido leh maaha oo kaliya codsiyada Android, laakiin sidoo kale kiisaska kale markaad u baahan tahay inaad go'aamiso in natiijadu ay leedahay fayl gaar ah.

Hawl: Ku dar taageero maktabad qolo saddexaad haddii aan si buuxda loo taageerin

xal: Tirada qaab-dhismeedka kala duwan ee loo isticmaalo habka qorista code ayaa si fudud uga baxsan jaantusyada. Dabcan, Checkmarx had iyo jeer ma yaqaanno jiritaankooda, hawsheenana waa inaan barno si aan u fahanno in hababka qaarkood ay si gaar ah uga tirsan yihiin qaabkan. Mararka qaarkood tani way adag tahay xaqiiqda ah in qaab-dhismeedyadu ay isticmaalaan magacyo shaqo oo aad u badan oo aan suurtogal ahayn in si aan mugdi lahayn loo go'aamiyo xiriirka wicitaan gaar ah oo maktabad gaar ah.

Dhibaatadu waxay tahay in syntax-ka maktabadaha noocaas ah aan had iyo jeer loo aqoonsan si sax ah waana inaad tijaabisaa si aad uga fogaato helitaanka tiro badan oo been abuur ah. Waxaa jira dhowr ikhtiyaar oo lagu hagaajinayo saxnaanta sawirka oo lagu xalliyo dhibaatada:

  • Doorashada koowaad, waxaan hubnaa in maktabadda loo isticmaalo mashruuc gaar ah oo lagu dabaqi karo sharciga heerka kooxda. Laakin haddii kooxdu ay go'aansato in ay qaado hab ka duwan ama ay isticmaasho dhowr maktabadood oo magacyadoodu ay is dulsaaran yihiin, waxaan heli karnaa sawir aan aad u wacneyn oo badan oo been abuur ah.

  • Doorashada labaad waa in la raadiyo faylasha ay maktabadda si cad uga soo degtay. Habkan, waxaan hubin karnaa in maktabadda aan u baahanahay si sax ah loogu isticmaalo faylkan.

  • Doorashada saddexaadna waa in la wada isticmaalo labada hab ee kor ku xusan.

Tusaale ahaan, aan eegno maktabad si fiican loogu yaqaan goobo cidhiidhi ah riixid loogu talagalay luqadda barnaamijka Scala, oo ah, shaqeynta Kala Qaybinta Qiimaha Suugaanta. Guud ahaan, si aad u gudbiso cabbirada weydiinta SQL, waa inaad isticmaashaa hawlwadeenka $, Kaas oo xogta u beddela su'aal SQL oo horay loo qaabeeyey. Taasi waa, dhab ahaantii, waa analooga tooska ah ee Bayaanka la diyaariyay ee Java. Laakiin, haddii aad u baahan tahay inaad si firfircoon u dhisto weydiinta SQL, tusaale ahaan, haddii aad u baahan tahay inaad ku gudubto magacyada miiska, waxaad isticmaali kartaa hawlwadeenka #$, kaas oo si toos ah xogta ugu beddeli doona weydiinta (ku dhawaad ​​sida isku xidhka xargaha).

Koodhka Tusaalaha:

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

Checkmarx weli ma garanayo sida loo ogaado isticmaalka Slicing Literal Values ​​oo ka boodo hawlwadeenada #$, markaa aan isku dayno inaan baro si loo aqoonsado cirbadaha SQL ee suurtagalka ah oo aan muujinno meelaha saxda ah ee koodka:

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

Hawl: Ka raadi shaqooyinka nugul ee la isticmaalay gudaha maktabadaha Open-Source

xal: Shirkado badan ayaa adeegsada aaladaha la socodka Isha-furan (OSA dhaqanka) si ay u ogaadaan adeegsiga noocyada nugul ee maktabadaha ee codsiyada horumarsan. Mararka qaarkood suurtogal ma aha in la cusboonaysiiyo maktabadda noocaan oo kale ah oo loo beddelo nuqul sugan. Xaaladaha qaarkood waxaa jira xaddidaadyo shaqeyneed, kuwa kalena ma jiro nooc badbaado ah oo dhan. Xaaladdan oo kale, isku darka SAST iyo dhaqamada OSA ayaa kaa caawin doona in la go'aamiyo in shaqooyinka u horseeda ka faa'iidaysiga nuglaanta aan lagu isticmaalin xeerka.

Laakiin mararka qaarkood, gaar ahaan marka la tixgelinayo JavaScript, tani ma noqon karto hawl gebi ahaanba fudud. Hoos waxaa ku yaal xal, laga yaabee inuusan ku fiicneyn, laakiin si kastaba ha ahaatee shaqeynaya, adoo isticmaalaya tusaalaha nuglaanshaha qaybta. lodash hababka template и *set.

Tusaalooyinka tijaabada kood u nugul ee ku jira faylka 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!'

Iyo marka si toos ah loogu xidho 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>

Waxaan raadineynaa dhammaan hababkayada nugul, kuwaas oo ku taxan meelaha nugul:

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

Hawl: Raadinta shahaadooyinka ku dhex jira codsiga

xal: Ma aha wax aan caadi ahayn codsiyada, gaar ahaan kuwa mobilada, inay isticmaalaan shahaadooyin ama furayaal si ay u galaan servero kala duwan ama loo xaqiijiyo SSL-Pinning. Marka loo eego dhinaca amniga, ku kaydinta waxyaabahan oo kale kood maaha habka ugu fiican. Aynu isku dayno inaan qorno xeer ka raadin doona faylal la mid ah kaydka:

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

Hawl: Helitaanka calaamado la jabiyay codsiga

xal: Inta badan waa lagama maarmaan in la buriyo calaamadihii la jabiyay ama macluumaadka kale ee muhiimka ah ee ku jira koodka. Dabcan, ku kaydinta gudaha koodhka isha maaha fikrad wanaagsan, laakiin xaaladuhu way kala duwan yihiin. Waad ku mahadsan tahay weydiimaha CxQL, helitaanka waxyaalahan oo kale aad ayay u fududahay:

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

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

gunaanad

Waxaan rajeynayaa in maqaalkani uu waxtar u yeelan doono kuwa bilaabaya aqoontooda aaladda Checkmarx. Waxaa laga yaabaa in kuwa qoraya xeerarkooda muddo dheer ay sidoo kale ka heli doonaan wax faa'iido leh hagahan.

Nasiib darro, hadda waxaa jira la'aan kheyraad ah oo fikrado cusub laga soo ururin karo inta lagu jiro horumarinta xeerarka Checkmarx. Taasi waa sababta aan u abuurnay kaydka Github, halkaas oo aan ku dhejin doono shaqadayada si qof kasta oo adeegsada CxQL uu uga helo wax faa'iido leh, sidoo kalena uu fursad u helo inuu shaqadiisa la wadaago bulshada. Kaydka ayaa ku jira habka buuxinta iyo qaabaynta tusmada, markaa ka qaybqaatayaasha waa la soo dhawaynayaa!

Qalbadda

Source: www.habr.com

Add a comment