Mar a sgrìobhas tu riaghailtean airson Checkmarx gun a bhith craicte

Hi Habr!

Anns an obair againn, bidh a’ chompanaidh againn gu math tric a’ dèiligeadh ri diofar innealan sgrùdaidh còd statach (SAST). A-mach às a 'bhogsa bidh iad uile ag obair cuibheasach. Gu dearbh, tha e uile an urra ris a 'phròiseact agus na teicneòlasan a thathar a' cleachdadh ann, a bharrachd air dè cho math 'sa tha na teicneòlasan sin air an còmhdach le riaghailtean mion-sgrùdadh. Nam bheachd-sa, is e aon de na slatan-tomhais as cudromaiche nuair a thaghas tu inneal SAST an comas a ghnàthachadh a rèir mion-fhiosrachadh nan tagraidhean agad, is e sin, riaghailtean sgrùdaidh a sgrìobhadh agus atharrachadh no, mar a chanar riutha nas trice, Ceistean Custom.

Mar a sgrìobhas tu riaghailtean airson Checkmarx gun a bhith craicte

Mar as trice bidh sinn a’ cleachdadh Checkmarx - anailisiche còd gu math inntinneach agus cumhachdach. San artaigil seo bruidhnidh mi mun eòlas agam air a bhith a’ sgrìobhadh riaghailtean anailis air a shon.

Clàr-innse

Clàrachadh

An toiseach, bu mhath leam aon de na beagan artaigilean ann an Ruisis a mholadh mu fheartan sgrìobhaidh cheistean airson Checkmarx. Chaidh fhoillseachadh air Habré aig deireadh 2019 fon tiotal: "Hello, Checkmarx!" Mar a sgrìobhas tu ceist Checkmarx SAST agus lorg so-leòntachd fionnar.

Bidh e a’ sgrùdadh gu mionaideach mar a sgrìobhas tu a’ chiad cheistean ann an CxQL (Checkmarx Query Language) airson cuid de thagradh deuchainn agus a’ sealltainn na prionnsapalan bunaiteach air mar a tha riaghailtean mion-sgrùdadh ag obair.

Cha dean mi a-rithist na tha air a mhìneachadh ann, ged a bhios cuid de eadar-ghearraidhean fhathast an làthair. Anns an artaigil agam feuchaidh mi ri seòrsa de “chruinneachadh de reasabaidhean” a chuir ri chèile, liosta de fhuasglaidhean air duilgheadasan sònraichte a choinnich mi fhad ‘s a bha mi ag obair le Checkmarx. B’ fheudar dhomh m’ inntinn a thogail thairis air mòran de na duilgheadasan sin. Aig amannan cha robh fiosrachadh gu leòr anns na sgrìobhainnean, agus uaireannan bha e eadhon duilich a thuigsinn ciamar a dhèanadh tu na bha a dhìth. Tha mi an dòchas nach bi m ’eòlas agus oidhcheannan gun chadal gu dìomhain, agus sàbhalaidh an“ cruinneachadh de reasabaidhean Custom Queries ”seo dhut beagan uairean a thìde no dhà de cheallan neoni. Mar sin, tòisichidh sinn!

Fiosrachadh coitcheann mu na riaghailtean

An toiseach, leig dhuinn sùil a thoirt air beagan bhun-bheachdan bunaiteach agus am pròiseas a bhith ag obair leis na riaghailtean, airson tuigse nas fheàrr fhaighinn air na thachras a-nis. Agus cuideachd leis nach eil na sgrìobhainnean ag ràdh dad mu dheidhinn seo no gu bheil e gu math sgapte san structar, nach eil gu math goireasach.

  1. Tha na riaghailtean air an cur an sàs rè sganadh a rèir an ro-aithris a chaidh a thaghadh aig an toiseach (seata de riaghailtean gnìomhach). Faodaidh tu àireamh neo-chuingealaichte de ro-òrdughan a chruthachadh, agus tha dìreach mar a nì thu structar orra an urra ri mion-fhiosrachadh a’ phròiseis agad. Faodaidh tu an cur ann am buidhnean a rèir cànan no ro-òrdughan a thaghadh airson gach pròiseact. Tha an àireamh de riaghailtean gnìomhach a 'toirt buaidh air astar agus neo-mhearachdachd an sganaidh.

    Mar a sgrìobhas tu riaghailtean airson Checkmarx gun a bhith craicteA 'suidheachadh Preset ann an eadar-aghaidh Checkmarx

  2. Tha na riaghailtean air an deasachadh ann an inneal sònraichte ris an canar CxAuditor. Is e aplacaid deasg a tha seo a tha a’ ceangal ri frithealaiche a tha a’ ruith Checkmarx. Tha dà dhòigh obrach aig an inneal seo: deasachadh riaghailtean agus mion-sgrùdadh air toraidhean scan a chaidh a dhèanamh mu thràth.

    Mar a sgrìobhas tu riaghailtean airson Checkmarx gun a bhith craicteCxAudit eadar-aghaidh

  3. Tha riaghailtean ann an Checkmarx air an roinn a rèir cànan, is e sin, tha seata cheistean fhèin aig gach cànan. Tha cuid de riaghailtean coitcheann ann cuideachd a tha a’ buntainn ge bith dè an cànan, is iad sin na ceistean bunaiteach ris an canar. Airson a’ mhòr-chuid, tha ceistean bunaiteach a’ toirt a-steach a bhith a’ lorg fiosrachadh a bhios riaghailtean eile a’ cleachdadh.

    Mar a sgrìobhas tu riaghailtean airson Checkmarx gun a bhith craicteA 'roinn riaghailtean le cànan

  4. Tha na riaghailtean “Co-ghnìomhaichte” agus “Neo-ghnìomhaichte” (Air an cur an gnìomh agus gun a bhith air an cur an gnìomh). Chan e buileach an t-ainm ceart, nam bheachd-sa, ach sin mar a tha e. Is e an loidhne gu h-ìosal gum bi toradh riaghailtean “Executable” a chuir an gnìomh air a thaisbeanadh anns na toraidhean scan san UI, agus tha feum air riaghailtean “Neo-ghnìomhaichte” dìreach gus na toraidhean aca a chleachdadh ann an iarrtasan eile (gu dearbh, dìreach gnìomh).

    Mar a sgrìobhas tu riaghailtean airson Checkmarx gun a bhith craicteCo-dhùnadh an t-seòrsa riaghailt nuair a chruthachadh

  5. Faodaidh tu riaghailtean ùra a chruthachadh no cur ris/ath-sgrìobhadh an fheadhainn a th’ ann mar-thà. Gus riaghailt ath-sgrìobhadh, feumaidh tu a lorg sa chraoibh, cliog deas agus tagh "Suas" bhon chlàr tuiteam-sìos. Tha e cudromach cuimhneachadh an seo nach eil na riaghailtean ùra air an toirt a-steach an toiseach anns na ro-òrdughan agus nach eil iad gnìomhach. Gus tòiseachadh gan cleachdadh feumaidh tu an cur an gnìomh anns a 'chlàr "Preset Manager" san ionnstramaid. Bidh riaghailtean ath-sgrìobhaidh a 'gleidheadh ​​​​na roghainnean aca, is e sin, ma bha an riaghailt gnìomhach, bidh e mar sin agus thèid a chur an sàs sa bhad.

    Mar a sgrìobhas tu riaghailtean airson Checkmarx gun a bhith craicteEisimpleir de riaghailt ùr anns an eadar-aghaidh Manaidsear Preset

  6. Aig àm cur gu bàs, thèid “craobh” de dh’ iarrtasan a thogail, a tha an urra ri dè. Tha na riaghailtean a bhios a’ cruinneachadh fiosrachaidh air an cur an gnìomh an toiseach, agus an fheadhainn a bhios ga chleachdadh san dàrna àite. Tha an toradh gnìomh air a thasgadh, mar sin ma tha e comasach toraidhean riaghailt gnàthaichte a chleachdadh, tha e nas fheàrr sin a dhèanamh, lughdaichidh seo an ùine sganaidh.

  7. Faodar riaghailtean a chuir an sàs aig diofar ìrean:

  • Airson an siostam gu lèir - thèid a chleachdadh airson sganadh sam bith de phròiseact sam bith

  • Aig ìre sgioba (Sgioba) - cha tèid a chleachdadh ach airson pròiseactan a sganadh san sgioba taghte.

  • Aig ìre a 'phròiseict - Thèid a chur an sàs ann am pròiseact sònraichte

    Mar a sgrìobhas tu riaghailtean airson Checkmarx gun a bhith craicteCo-dhùnadh dè an ìre aig an tèid an riaghailt a chuir an sàs

"Faclair" airson luchd-tòiseachaidh

Agus tòisichidh mi le beagan rudan a dh’ adhbhraich ceistean dhomh, agus seallaidh mi cuideachd grunn dhòighean a nì beatha nas sìmplidhe gu mòr.

Gnìomhan le liostaichean

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

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

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

A h-uile stuth a chaidh a lorg

Taobh a-staigh a’ chànan a chaidh a sganadh, gheibh thu liosta de na h-eileamaidean gu lèir a dh’ ainmich Checkmarx (seudan, gnìomhan, clasaichean, dòighean, msaa). Seo beagan rùm de stuthan a gheibhear troimhe All. Is e sin, lorg nì le ainm sònraichte searchMe, faodaidh tu rannsachadh, mar eisimpleir, a rèir ainm thar gach nì a chaidh a lorg:

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

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

Ach, ma dh’ fheumas tu sgrùdadh a dhèanamh ann an cànan eile nach deach a thoirt a-steach don scan airson adhbhar air choireigin (mar eisimpleir, groovy ann am pròiseact Android), faodaidh tu an raon nì againn a leudachadh tro chaochladair:

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

Gnìomhan airson mion-sgrùdadh sruth

Tha na gnìomhan sin air an cleachdadh ann an iomadh riaghailt agus seo beagan meallta de na tha iad a’ ciallachadh:

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

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

A’ faighinn ainm faidhle/slighe

Tha grunn bhuadhan ann a gheibhear bho thoraidhean ceist (ainm an fhaidhle anns an deach an inntrigeadh a lorg, sreang, msaa), ach chan eil na sgrìobhainnean ag innse mar a gheibhear agus a chleachdas iad iad. Mar sin, gus seo a dhèanamh, feumaidh tu faighinn gu togalach LinePragma agus bidh na stuthan a dh’ fheumas sinn suidhichte na bhroinn:

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

Is fhiach sin a chumail nad inntinn FileName gu dearbh tha an t-slighe chun an fhaidhle, leis gun do chleachd sinn am modh GetFirstGraph.

Toradh cur gu bàs

Tha caochladair sònraichte taobh a-staigh CxQL result, a thilleas mar thoradh air do riaghailt sgrìobhte a chur an gnìomh. Tha e air a thòiseachadh sa bhad agus faodaidh tu toraidhean eadar-mheadhanach a sgrìobhadh a-steach ann, gan atharrachadh agus gan ùrachadh fhad ‘s a tha thu ag obair. Ach, mura h-eil sònrachadh don chaochladair no gnìomh seo taobh a-staigh na riaghailt return- bidh an toradh gu bàs an-còmhnaidh neoni.

Cha toir a’ cheist a leanas dad dhuinn mar thoradh air a’ chur gu bàs agus bidh i an-còmhnaidh falamh:

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

Ach, às deidh dhuinn an toradh cur gu bàs a shònrachadh don toradh caochlaideach draoidheil, chì sinn dè a thilleas a’ ghairm seo thugainn:

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

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

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

A 'cleachdadh toraidhean riaghailtean eile

Faodar riaghailtean ann an Checkmarx a ghairm coltach ri gnìomhan ann an cànan prògramadh cunbhalach. Nuair a bhios tu a’ sgrìobhadh riaghailt, faodaidh tu toraidhean cheistean eile a chleachdadh. Mar eisimpleir, chan fheumar a h-uile gairm modh a lorg sa chòd a h-uile uair, dìreach cuir fios chun riaghailt a tha thu ag iarraidh:

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

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

Leigidh an dòigh-obrach seo leat an còd a ghiorrachadh agus an ùine cur an gnìomh riaghailtean a lughdachadh gu mòr.

Fuasgladh dhuilgheadasan

Logadh

Nuair a bhios tu ag obair leis an inneal, uaireannan chan eil e comasach a 'cheist a tha thu ag iarraidh a sgrìobhadh sa bhad agus feumaidh tu feuchainn, a' feuchainn diofar roghainnean. Airson a leithid de chùis, tha an inneal a 'toirt seachad logadh, ris an canar mar a leanas:

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

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

Ach is fhiach cuimhneachadh gu bheil an dòigh seo a 'gabhail ris a-mhàin mar chur-a-steach sreang, mar sin cha bhith e comasach liosta iomlan de na h-eileamaidean a chaidh a lorg a thaisbeanadh mar thoradh air a’ chiad obrachadh. Is e an dàrna roghainn, a thathas a’ cleachdadh airson debugging, a bhith a’ sònrachadh do chaochladair draoidheachd bho àm gu àm result toradh na ceiste agus faic dè thachras. Chan eil an dòigh-obrach seo glè ghoireasach; feumaidh tu a bhith cinnteach nach eil cus no gnìomhachd sam bith ann le seo sa chòd às deidh sin result no dìreach thoir beachd air a’ chòd gu h-ìosal. No faodaidh tu, mar mise, dìochuimhneachadh grunn ghairmean mar sin a thoirt air falbh bho riaghailt deiseil agus iongnadh carson nach obraich dad.

Is e dòigh nas freagarraiche am modh a ghairm return le paramadair riatanach. Anns a 'chùis seo, thig crìoch air coileanadh na riaghailt agus chì sinn dè thachair mar thoradh air na sgrìobh sinn:

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

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

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

Duilgheadas logadh a-steach

Tha suidheachaidhean ann nuair nach urrainn dhut faighinn chun inneal CxAudit (a thathas a’ cleachdadh airson riaghailtean a sgrìobhadh). Faodaidh iomadh adhbhar a bhith ann airson seo, a’ gabhail a-steach tubaistean, ùrachaidhean obann Windows, BSOD agus suidheachaidhean eile ris nach robh dùil a tha taobh a-muigh ar smachd. Anns a 'chùis seo, uaireannan bidh seisean neo-chrìochnaichte anns an stòr-dàta, a chuireas casg ort bho bhith a' logadh a-steach a-rithist. Gus a chàradh, feumaidh tu grunn cheistean a ruith:

Airson Checkmarx ro 8.6:

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

Airson Checkmarx às deidh 8.6:

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

Riaghailtean sgrìobhaidh

A-nis tha sinn a 'faighinn chun a' phàirt as inntinniche. Nuair a thòisicheas tu a’ sgrìobhadh riaghailtean ann an CxQL, chan eil an rud a tha dhìth ort gu tric cho mòr ri eisimpleirean beò de bhith a’ fuasgladh dhuilgheadasan sònraichte agus a’ toirt cunntas air a’ phròiseas air mar a bhios ceistean ag obair san fharsaingeachd.

Feuchaidh mi ri beatha a dhèanamh beagan nas fhasa dhaibhsan a tha a’ tòiseachadh a’ dàibheadh ​​​​a-steach do chànan na ceiste agus bheir mi grunn eisimpleirean seachad air a bhith a’ cleachdadh Custom Queries gus fuasgladh fhaighinn air duilgheadasan sònraichte. Tha cuid dhiubh gu math coitcheann agus faodar an cleachdadh anns a 'chompanaidh agad gu practaigeach gun atharrachaidhean, tha cuid eile nas mionaidiche, ach faodar an cleachdadh cuideachd le bhith ag atharrachadh a' chòd gus freagairt air mion-fhiosrachadh nan tagraidhean agad.

Mar sin, seo na duilgheadasan a choinnich sinn as trice:

Obair: Tha grunn Sruthan ann an co-dhùnaidhean a 'cur an gnìomh an riaghailt agus aon dhiubh a' neadachadh fear eile, feumaidh tu fàgail aon dhiubh.

fuasgladh: Gu dearbh, uaireannan bidh Checkmarx a 'sealltainn grunn shruthan dàta a dh' fhaodadh a bhith a 'dol thairis air agus a bhith na dhreach nas giorra de chuid eile. Tha dòigh sònraichte ann airson a leithid de chùisean Lùghdaich Sruth. A rèir am paramadair, taghaidh e an sruth as giorra no as fhaide:

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

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

Obair: Leudaich an liosta de dhàta mothachail ris a bheil an inneal ag ath-fhreagairt

fuasgladh: Tha riaghailtean bunaiteach aig Checkmarx, agus tha na toraidhean air an cleachdadh le mòran cheistean eile. Le bhith a’ cur ri cuid de na riaghailtean sin le dàta a tha sònraichte don tagradh agad, faodaidh tu na toraidhean scan agad a leasachadh sa bhad. Gu h-ìosal tha eisimpleir de riaghailt airson do thòiseachadh:

liosta_prìobhaideachd_coitcheann

Nach cuir sinn grunn chaochladairean ris a thathas a’ cleachdadh san tagradh againn gus fiosrachadh mothachail a stòradh:

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

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

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

Obair: Leudaich liosta nan caochladairean le faclan-faire

fuasgladh: Mholainn sa bhad aire a thoirt don riaghailt bhunasach airson faclan-faire a mhìneachadh ann an còd agus cuir ris liosta de dh’ ainmean caochlaideach a tha gu cumanta air an cleachdadh sa chompanaidh agad.

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

Obair: Cuir ris frèaman cleachdte nach eil a’ faighinn taic bho Checkmarx

fuasgladh: Tha a h-uile ceist ann an Checkmarx air a roinn a rèir cànan, agus mar sin feumaidh tu riaghailtean a chuir ris airson gach cànan. Gu h-ìosal tha eisimpleirean de riaghailtean mar sin.

Ma thèid leabharlannan a chleachdadh a chuireas ri no a chuireas an àite gnìomhachd àbhaisteach, faodar an cur gu furasta ris an riaghailt bhunasach. An uairsin ionnsaichidh a h-uile duine a chleachdas e sa bhad mu na ro-ràdh ùr. Mar eisimpleir, is e Fiodh agus Loggi leabharlannan airson logadh a-steach Android. Anns a’ phacaid bhunaiteach, chan eil riaghailtean ann airson fiosan neo-shiostam a chomharrachadh, mar sin ma gheibh facal-faire no aithnichear seisean a-steach don loga, cha bhith fios againn mu dheidhinn. Feuchaidh sinn ri mìneachaidhean de dhòighean leithid seo a chur ri riaghailtean Checkmarx.

Eisimpleir còd deuchainn a chleachdas an leabharlann Fiodha airson logadh:

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

Agus seo eisimpleir de iarrtas airson Checkmarx, a leigeas leat mìneachadh a chuir ris a bhith a’ gairm dhòighean fiodha mar àite fàgail airson dàta bhon tagradh:

Lorg toraidhean Android

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

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

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

Agus faodaidh tu cuideachd cur ris an riaghailt nàbaidh, ach tha am fear seo a 'buntainn gu dìreach ri logadh a-steach Android:

LorgAndroidLog_Toraidhean

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

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

Cuideachd, ma chleachdas Android aplacaidean Manaidsear-obrach airson obair asyncronach, is e deagh bheachd a th’ ann fios a chuir gu Checkmarx mu dheidhinn seo le bhith a’ cur dòigh ris airson dàta fhaighinn bhon ghnìomh getInputData:

Lorg AndroidRead

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

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

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

Obair: A’ lorg dàta mothachail ann am plist airson pròiseactan iOS

fuasgladh: Bidh iOS gu tric a 'cleachdadh faidhlichean sònraichte leis an leudachadh .plist gus caochladh caochladairean agus luachan a stòradh. Chan eilear a’ moladh faclan-faire, comharran, iuchraichean agus dàta mothachail eile a stòradh anns na faidhlichean sin, oir faodar an toirt a-mach às an inneal gun duilgheadas sam bith.

Tha feartan aig faidhlichean plist nach eil follaiseach don t-sùil rùisgte, ach a tha cudromach do Checkmarx. Sgrìobhamaid riaghailt a nì rannsachadh airson an dàta a tha a dhìth oirnn agus innse dhuinn a bheil faclan-faire no comharran air an ainmeachadh an àiteigin.

Eisimpleir de leithid de fhaidhle, anns a bheil comharra airson conaltradh leis an t-seirbheis backend:

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

Agus riaghailt airson Checkmarx, aig a bheil grunn nuances a bu chòir aire a thoirt nuair a thathar a’ sgrìobhadh:

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

Obair: Lorg fiosrachadh ann an XML

fuasgladh: Tha gnìomhan gu math goireasach aig Checkmarx airson a bhith ag obair le XML agus a’ lorg luachan, tagaichean, buadhan agus barrachd. Ach, gu mì-fhortanach, bha mearachd anns na sgrìobhainnean air sgàth 's nach eil aon eisimpleir ag obair. A dh 'aindeoin gu bheil an uireasbhaidh seo air a chuir às anns an dreach as ùire de na sgrìobhainnean, bi faiceallach ma chleachdas tu dreachan nas tràithe de sgrìobhainnean.

Seo eisimpleir ceàrr bhon sgrìobhainn:

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

Mar thoradh air an oidhirp cur gu bàs, gheibh sinn mearachd a tha All chan eil an leithid de dhòigh ann ... Agus tha seo fìor, leis gu bheil àite sònraichte, fa leth ann airson gnìomhan a chleachdadh airson obrachadh le XML - cxXPath. Seo cò ris a tha a’ cheist cheart coltach gus suidheachadh a lorg ann an Android a leigeas le trafaic HTTP a chleachdadh:

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

Bheir sinn sùil air ann am beagan nas mionaidiche, leis gu bheil an co-chòrdadh airson a h-uile gnìomh coltach, às deidh dhut fear a dhèanamh a-mach, feumaidh tu dìreach am fear a tha a dhìth ort a thaghadh. Mar sin, ann an òrdugh a rèir nam paramadairean:

  • "*.xml"- masg faidhlichean ri sgrùdadh

  • 8 — id a’ chànain airson a bheil an riaghailt air a cur an gnìomh

  • "cleartextTrafficPermitted"- ainm feart ann an xml

  • "true" - luach a 'ghnè seo

  • false - cleachdadh faireachdainn cunbhalach nuair a thathar a’ rannsachadh

  • true - a’ ciallachadh gun tèid an sgrùdadh a dhèanamh a’ seachnadh cùis, is e sin, cùis-mhothachail

Mar eisimpleir, chleachd sinn riaghailt a tha a’ comharrachadh roghainnean ceangail lìonra ann an Android a tha ceàrr, bho shealladh tèarainteachd, a leigeas le conaltradh leis an t-seirbheisiche tro phròtacal HTTP. Eisimpleir de shuidheachadh anns a bheil feart cleartextTrafficPermitted le brìgh 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>

Obair: Cuir crìoch air toraidhean a rèir ainm faidhle / slighe

fuasgladh: Ann am fear de na pròiseactan mòra co-cheangailte ri leasachadh tagradh gluasadach airson Android, thachair sinn ri nithean ceàrr air an riaghailt a tha a’ dearbhadh suidheachadh an t-suidheachaidh obfuscation. Is e an fhìrinn gu bheil an riaghailt a-mach às a 'bhogsa a' lorg anns an fhaidhle build.gradle suidheachadh le uallach airson riaghailtean obfuscation a chuir an sàs airson dreach fuasglaidh an tagraidh.

Ach ann am pròiseactan mòra uaireannan tha faidhlichean chloinne build.gradle, a tha a’ toirt iomradh air na leabharlannan a tha sa phròiseact. Is e an rud sònraichte, eadhon ged nach eil na faidhlichean sin a’ nochdadh gu bheil feum air obfuscation, thèid roghainnean faidhle cruinneachaidh phàrant a chuir an sàs aig àm cur ri chèile.

Mar sin, is e an obair a bhith a’ gearradh dheth cnapan-starra ann am faidhlichean cloinne a bhuineas do leabharlannan. Faodar an comharrachadh le làthaireachd na loidhne apply 'com.android.library'.

Eisimpleir còd bhon fhaidhle build.gradle, a tha a’ dearbhadh an fheum air obfuscation:

apply plugin: 'com.android.application'

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

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

dependencies {
  ...
}

Eisimpleir faidhle build.gradle airson leabharlann a tha sa phròiseact aig nach eil an suidheachadh seo:

apply plugin: 'android-library'

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

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

Agus an riaghailt airson 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);
		}
	}
}

Faodaidh an dòigh-obrach seo a bhith gu math uile-choitcheann agus feumail chan ann a-mhàin airson tagraidhean Android, ach cuideachd airson cùisean eile nuair a dh’ fheumas tu faighinn a-mach a bheil toradh a ’buntainn ri faidhle sònraichte.

Obair: Cuir taic ri leabharlann treas-phàrtaidh mura h-eil làn thaic aig a’ cho-chòrdadh

fuasgladh: Tha an àireamh de dhiofar fhrèaman a thathas a’ cleachdadh ann a bhith a’ sgrìobhadh còd dìreach far na clàran. Gu dearbh, chan eil fios aig Checkmarx gu bheil iad ann an-còmhnaidh, agus is e an obair againn a theagasg gus tuigsinn gu bheil cuid de dhòighean-obrach gu sònraichte a’ buntainn ris an fhrèam seo. Uaireannan tha seo iom-fhillte leis gu bheil frèamaichean a 'cleachdadh ainmean gnìomh a tha gu math cumanta agus tha e do-dhèanta a bhith a' dearbhadh gu neo-chinnteach an dàimh eadar gairm sònraichte agus leabharlann sònraichte.

Is e an duilgheadas a th’ ann nach eil co-chòrdadh nan leabharlannan sin an-còmhnaidh air aithneachadh gu ceart agus feumaidh tu feuchainn gus nach faigh thu àireamh mhòr de rudan ceàrr. Tha grunn roghainnean ann airson cruinneas an sganaidh a leasachadh agus an duilgheadas fhuasgladh:

  • A 'chiad roghainn, tha fios againn gu cinnteach gu bheil an leabharlann air a chleachdadh ann am pròiseact sònraichte agus is urrainn dhuinn an riaghailt a chuir an sàs aig ìre sgioba. Ach ma cho-dhùnas an sgioba dòigh-obrach eadar-dhealaichte a chleachdadh no ma chleachdas iad grunn leabharlannan anns a bheil ainmean gnìomh a’ dol an lùib a chèile, gheibh sinn dealbh nach eil gu math tlachdmhor de ghrunn rudan meallta.

  • Is e an dàrna roghainn faidhlichean a lorg anns a bheil an leabharlann air a thoirt a-steach gu soilleir. Leis an dòigh-obrach seo, faodaidh sinn a bhith cinnteach gu bheil an leabharlann a tha a dhìth oirnn air a chleachdadh gu dìreach san fhaidhle seo.

  • Agus is e an treas roghainn an dà dhòigh-obrach gu h-àrd a chleachdadh còmhla.

Mar eisimpleir, leig dhuinn sùil a thoirt air leabharlann a tha ainmeil ann an cearcallan cumhang slaodach airson cànan prògramadh Scala, is e sin, an comas-gnìomh A’ sgoltadh luachan litreachail. San fharsaingeachd, gus crìochan a chuir gu ceist SQL, feumaidh tu an gnìomhaiche a chleachdadh $, a chuireas an àite dàta gu ceist SQL ro-chruthaichte. Is e sin, gu dearbh, tha e na analog dìreach de Aithris Ullaichte ann an Java. Ach, ma dh'fheumas tu ceist SQL a thogail gu fiùghantach, mar eisimpleir, ma dh'fheumas tu ainmean bùird a thoirt seachad, faodaidh tu an gnìomhaiche a chleachdadh #$, a chuireas an dàta gu dìreach a-steach don cheist (cha mhòr mar co-chòrdadh sreang).

Còd sampaill:

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

Chan eil fios aig Checkmarx fhathast mar a lorgar cleachdadh Splicing Literal Values ​​agus gnìomhaichean sgiobannan #$, mar sin feuchaidh sinn ri a theagasg gus stealladh SQL a chomharrachadh agus na h-àiteachan ceart sa chòd a chomharrachadh:

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

Obair: Lorg gnìomhan so-leònte cleachdte ann an leabharlannan Open-Source

fuasgladh: Bidh mòran chompanaidhean a’ cleachdadh innealan sgrùdaidh Open-Source (cleachdadh OSA) gus cleachdadh dreachan so-leònte de leabharlannan ann an tagraidhean leasaichte a lorg. Aig amannan chan eil e comasach leabharlann mar sin ùrachadh gu dreach tèarainte. Ann an cuid de chùisean tha cuingealachaidhean gnìomh ann, ann an cuid eile chan eil dreach sàbhailte idir ann. Anns a 'chùis seo, cuidichidh measgachadh de chleachdaidhean SAST agus OSA le bhith a' dearbhadh nach eil na gnìomhan a tha a 'leantainn gu bhith a' cleachdadh so-leòntachd air an cleachdadh sa chòd.

Ach uaireannan, gu sònraichte nuair a thathar a’ beachdachadh air JavaScript, is dòcha nach e obair gu tur beag a tha seo. Gu h-ìosal tha fuasgladh, 's dòcha nach eil air leth freagarrach, ach a dh'aindeoin sin ag obair, a' cleachdadh an eisimpleir de so-leòntachd anns a 'phàirt lodash ann an dòighean template и *set.

Eisimpleirean de chòd deuchainn a dh’ fhaodadh a bhith so-leònte ann am faidhle 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!'

Agus nuair a nì thu ceangal dìreach ann an 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>

Tha sinn a’ coimhead airson na dòighean so-leònte againn uile, a tha air an liostadh ann an so-leòntachd:

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

Obair: A’ lorg theisteanasan freumhaichte san tagradh

fuasgladh: Chan eil e neo-àbhaisteach do thagraidhean, gu sònraichte feadhainn gluasadach, teisteanasan no iuchraichean a chleachdadh gus faighinn gu diofar luchd-frithealaidh no dearbhadh SSL-Pinning. Bho shealladh tèarainteachd, chan e stòradh rudan mar sin ann an còd an cleachdadh as fheàrr. Feuchaidh sinn ri riaghailt a sgrìobhadh a nì rannsachadh airson faidhlichean coltach ris san stòr:

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

Obair: Lorg comharran cunnartach san tagradh

fuasgladh: Gu tric feumar comharran cunnartach no fiosrachadh cudromach eile a tha an làthair sa chòd a chùl-ghairm. Gu dearbh, chan e deagh bheachd a th ’ann an stòradh taobh a-staigh a’ chòd stòr, ach tha suidheachaidhean ag atharrachadh. Taing do cheistean CxQL, tha e gu math furasta rudan mar seo a lorg:

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

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

co-dhùnadh

Tha mi an dòchas gum bi an artaigil seo feumail dhaibhsan a tha a’ tòiseachadh air eòlas fhaighinn air inneal Checkmarx. Is dòcha gum faigh an fheadhainn a tha air a bhith a’ sgrìobhadh na riaghailtean aca fhèin airson ùine fhada rudeigin feumail san iùl seo.

Gu mì-fhortanach, tha gainnead ghoireasan ann an-dràsta far am faodadh beachdan ùra a bhith air an cruinneachadh nuair a thathar a’ leasachadh riaghailtean airson Checkmarx. Sin as coireach gun do chruthaich sinn ionad-tasgaidh air Github, far am bi sinn a’ postadh ar n-obair gus am faigh a h-uile duine a chleachdas CxQL rudeigin feumail innte, agus cuideachd cothrom fhaighinn an obair aca a cho-roinn leis a’ choimhearsnachd. Tha an stòr an-dràsta a’ lìonadh agus a’ structaradh susbaint, agus mar sin tha fàilte air luchd-tabhartais!

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

Source: www.habr.com

Cuir beachd ann