Bii o ṣe le kọ awọn ofin fun Checkmarx laisi aṣiwere

Hey Habr!

Ninu iṣẹ wa, ile-iṣẹ wa nigbagbogbo ṣe ajọṣepọ pẹlu ọpọlọpọ awọn irinṣẹ itupalẹ koodu aimi (SAST). Jade kuro ninu apoti gbogbo wọn ṣiṣẹ ni apapọ. Nitoribẹẹ, gbogbo rẹ da lori iṣẹ akanṣe ati awọn imọ-ẹrọ ti a lo ninu rẹ, bii bii awọn imọ-ẹrọ wọnyi ti bo nipasẹ awọn ofin itupalẹ. Ni ero mi, ọkan ninu awọn iyasọtọ pataki julọ nigbati o yan ohun elo SAST ni agbara lati ṣe akanṣe rẹ si awọn pato ti awọn ohun elo rẹ, eyun, kọ ati yi awọn ofin itupalẹ pada tabi, bi wọn ti n pe nigbagbogbo, Awọn ibeere Aṣa.

Bii o ṣe le kọ awọn ofin fun Checkmarx laisi aṣiwere

Nigbagbogbo a lo Checkmarx - iyanilenu pupọ ati oluyẹwo koodu ti o lagbara. Ninu nkan yii Emi yoo sọrọ nipa iriri mi ti awọn ofin itupalẹ kikọ fun rẹ.

Tabili ti awọn akoonu

Ifihan

Lati bẹrẹ pẹlu, Emi yoo fẹ lati ṣeduro ọkan ninu awọn nkan diẹ ni Russian nipa awọn ẹya ti awọn ibeere kikọ fun Checkmarx. O ti tẹjade lori Habré ni opin ọdun 2019 labẹ akọle: "Hello, Checkmarx!" Bii o ṣe le kọ ibeere Checkmarx SAST ki o wa awọn ailagbara tutu.

O ṣe ayẹwo ni kikun bi o ṣe le kọ awọn ibeere akọkọ ni CxQL (Ede ibeere Checkmarx) fun diẹ ninu ohun elo idanwo ati ṣafihan awọn ipilẹ ipilẹ ti bii awọn ofin itupalẹ ṣiṣẹ.

Emi kii yoo tun ohun ti a ṣalaye ninu rẹ ṣe, botilẹjẹpe diẹ ninu awọn ikorita yoo tun wa. Ninu nkan mi Emi yoo gbiyanju lati ṣajọ iru “ikojọpọ awọn ilana”, atokọ ti awọn ojutu si awọn iṣoro kan pato ti Mo pade lakoko iṣẹ mi pẹlu Checkmarx. Mo ni lati gbe opolo mi lori ọpọlọpọ awọn iṣoro wọnyi. Nigba miiran alaye ko to ninu iwe, ati nigba miiran o nira paapaa lati ni oye bi o ṣe le ṣe ohun ti o nilo. Mo nireti pe iriri mi ati awọn alẹ ti ko sùn kii yoo jẹ asan, ati pe “ikojọpọ ti awọn ilana Awọn ibeere Aṣa” yoo gba ọ ni awọn wakati diẹ tabi awọn sẹẹli aifọkanbalẹ meji. Nitorinaa, jẹ ki a bẹrẹ!

Gbogbogbo alaye lori awọn ofin

Ni akọkọ, jẹ ki a wo awọn imọran ipilẹ diẹ ati ilana ti ṣiṣẹ pẹlu awọn ofin, fun oye ti o dara julọ ti ohun ti yoo ṣẹlẹ nigbamii. Ati pe nitori pe iwe-ipamọ ko sọ ohunkohun nipa eyi tabi ti tan kaakiri ni eto, eyiti ko rọrun pupọ.

  1. Awọn ofin naa ni lilo lakoko ọlọjẹ da lori tito tẹlẹ ti a yan ni ibẹrẹ (eto awọn ofin ti nṣiṣe lọwọ). O le ṣẹda nọmba ailopin ti awọn tito tẹlẹ, ati bi o ṣe le ṣeto wọn da lori awọn pato ti ilana rẹ. O le ṣe akojọpọ wọn nipasẹ ede tabi yan awọn tito tẹlẹ fun iṣẹ akanṣe kọọkan. Nọmba awọn ofin ti nṣiṣe lọwọ ni ipa lori iyara ati deede ti ọlọjẹ.

    Bii o ṣe le kọ awọn ofin fun Checkmarx laisi aṣiwereṢiṣeto Tito tẹlẹ ni wiwo Checkmarx

  2. Awọn ofin ti wa ni satunkọ ni pataki kan ọpa ti a npe ni CxAuditor. Eyi jẹ ohun elo tabili tabili ti o sopọ si olupin ti nṣiṣẹ Checkmarx. Ọpa yii ni awọn ọna ṣiṣe meji: awọn ofin ṣiṣatunṣe ati itupalẹ awọn abajade ti ọlọjẹ ti a ṣe tẹlẹ.

    Bii o ṣe le kọ awọn ofin fun Checkmarx laisi aṣiwereCxAudit ni wiwo

  3. Awọn ofin ni Checkmarx ti pin nipasẹ ede, iyẹn ni, ede kọọkan ni eto awọn ibeere tirẹ. Awọn ofin gbogbogbo tun wa ti o kan laibikita ede, iwọnyi ni ohun ti a pe ni awọn ibeere ipilẹ. Fun apakan pupọ julọ, awọn ibeere ipilẹ ni wiwa fun alaye ti awọn ofin miiran lo.

    Bii o ṣe le kọ awọn ofin fun Checkmarx laisi aṣiwerePipin awọn ofin nipasẹ ede

  4. Awọn ofin ti wa ni "Executable" ati "Non-Executable" (Ṣiṣe ati ki o ko ṣiṣẹ). Kii ṣe orukọ pipe, ni ero mi, ṣugbọn iyẹn ni. Laini isalẹ ni pe abajade ti ṣiṣe awọn ofin “Executable” yoo han ni awọn abajade ọlọjẹ ni UI, ati awọn ofin “Non-Executable” nilo nikan lati lo awọn abajade wọn ni awọn ibeere miiran (ni pataki, iṣẹ kan).

    Bii o ṣe le kọ awọn ofin fun Checkmarx laisi aṣiwereTi npinnu iru ofin nigba ṣiṣẹda

  5. O le ṣẹda awọn ofin titun tabi ṣe afikun / tun awọn ti o wa tẹlẹ kọ. Lati tun ofin kọ, o nilo lati wa ninu igi, tẹ-ọtun ki o yan “Idanu” lati inu akojọ aṣayan-isalẹ. O ṣe pataki lati ranti nibi pe awọn ofin tuntun ko wa lakoko ti o wa ninu awọn tito tẹlẹ ati pe ko ṣiṣẹ. Lati bẹrẹ lilo wọn o nilo lati mu wọn ṣiṣẹ ni akojọ aṣayan “Oluṣakoso tito tẹlẹ” ninu ohun elo. Awọn ofin ti a tun kọwe ṣe idaduro awọn eto wọn, iyẹn ni, ti ofin ba ṣiṣẹ, yoo wa bẹ ati pe yoo lo lẹsẹkẹsẹ.

    Bii o ṣe le kọ awọn ofin fun Checkmarx laisi aṣiwereApẹẹrẹ ti ofin titun ni wiwo Alakoso Tito tẹlẹ

  6. Lakoko ipaniyan, “igi” ti awọn ibeere ti kọ, eyiti o da lori kini. Awọn ofin ti o gba alaye ni a ṣe ni akọkọ, ati awọn ti o lo ni keji. Abajade ipaniyan ti wa ni ipamọ, nitorina ti o ba ṣee ṣe lati lo awọn abajade ti ofin ti o wa tẹlẹ, lẹhinna o dara lati ṣe bẹ, eyi yoo dinku akoko ọlọjẹ naa.

  7. Awọn ofin le ṣee lo ni awọn ipele oriṣiriṣi:

  • Fun gbogbo eto - yoo ṣee lo fun eyikeyi Antivirus ti eyikeyi ise agbese

  • Ni ipele ẹgbẹ (Egbe) - yoo ṣee lo lati ṣe ọlọjẹ awọn iṣẹ akanṣe ni ẹgbẹ ti o yan.

  • Ni ipele ise agbese - Yoo lo ni iṣẹ akanṣe kan pato

    Bii o ṣe le kọ awọn ofin fun Checkmarx laisi aṣiwereṢiṣe ipinnu ipele ti ofin yoo lo

"Dictionary" fun olubere

Ati pe Emi yoo bẹrẹ pẹlu awọn nkan diẹ ti o fa awọn ibeere mi, ati pe Emi yoo tun ṣafihan ọpọlọpọ awọn ilana ti yoo jẹ ki igbesi aye di irọrun.

Mosi pẹlu awọn akojọ

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

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

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

Gbogbo awọn nkan ti o rii

Laarin ede ti a ṣayẹwo, o le gba atokọ ti gbogbo awọn eroja ti Checkmarx ti ṣe idanimọ (awọn gbolohun ọrọ, awọn iṣẹ, awọn kilasi, awọn ọna, ati bẹbẹ lọ). Eyi jẹ diẹ ninu awọn aaye ti awọn nkan ti o le wọle nipasẹ All. Iyẹn ni, lati wa ohun kan pẹlu orukọ kan pato searchMe, o le wa, fun apẹẹrẹ, nipasẹ orukọ kọja gbogbo awọn nkan ti a ri:

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

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

Ṣugbọn, ti o ba nilo lati wa ni ede miiran pe fun idi kan ko si ninu ọlọjẹ naa (fun apẹẹrẹ, groovy ninu iṣẹ akanṣe Android kan), o le faagun aaye nkan wa nipasẹ oniyipada kan:

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

Awọn iṣẹ fun Sisan onínọmbà

Awọn iṣẹ wọnyi ni a lo ni awọn ofin pupọ ati pe eyi ni iwe iyanjẹ kekere ti kini wọn tumọ si:

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

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

Ngba orukọ faili / ọna

Awọn abuda pupọ lo wa ti o le gba lati awọn abajade ibeere kan (orukọ faili ninu eyiti a ti rii titẹ sii, okun, ati bẹbẹ lọ), ṣugbọn iwe ko sọ bi o ṣe le gba ati lo wọn. Nitorinaa, lati le ṣe eyi, o nilo lati wọle si ohun-ini LinePragma ati awọn nkan ti a nilo yoo wa ninu rẹ:

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

O tọ lati tọju ni lokan pe FileName ni kosi ona si faili, niwon a lo ọna GetFirstGraph.

Abajade ipaniyan

Oniyipada pataki kan wa ninu CxQL result, eyi ti o da abajade ti ṣiṣe ofin kikọ rẹ pada. O ti wa ni ipilẹṣẹ lẹsẹkẹsẹ ati pe o le kọ awọn abajade agbedemeji sinu rẹ, yiyipada ati isọdọtun wọn bi o ṣe n ṣiṣẹ. Ṣugbọn, ti ko ba si iṣẹ iyansilẹ si oniyipada yii tabi iṣẹ inu ofin naa return- abajade ipaniyan yoo ma jẹ odo nigbagbogbo.

Ibeere atẹle yii kii yoo da ohunkohun pada si wa bi abajade ti ipaniyan ati pe yoo jẹ ofo nigbagbogbo:

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

Ṣugbọn, ti yan abajade ipaniyan si abajade oniyipada idan, a yoo rii kini ipe yii pada si wa:

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

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

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

Lilo awọn abajade ti awọn ofin miiran

Awọn ofin ni Checkmarx ni a le pe ni afiwe si awọn iṣẹ ni ede siseto deede. Nigbati o ba nkọ ofin, o le lo awọn abajade ti awọn ibeere miiran. Fun apẹẹrẹ, ko si iwulo lati wa gbogbo awọn ipe ọna ninu koodu ni gbogbo igba, kan pe ofin ti o fẹ:

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

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

Ọna yii gba ọ laaye lati kuru koodu naa ati dinku akoko ipaniyan ofin ni pataki.

Yanju isoro

Wọle

Nigbati o ba n ṣiṣẹ pẹlu ọpa, nigbakan ko ṣee ṣe lati kọ ibeere ti o fẹ lẹsẹkẹsẹ ati pe o ni lati ṣe idanwo, gbiyanju awọn aṣayan oriṣiriṣi. Fun iru ọran bẹ, ọpa naa pese gedu, eyiti a pe ni atẹle yii:

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

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

Ṣugbọn o tọ lati ranti pe ọna yii gba nikan bi titẹ sii okun, nitorinaa kii yoo ṣee ṣe lati ṣafihan atokọ pipe ti awọn eroja ti a rii nitori abajade iṣẹ akọkọ. Aṣayan keji, eyiti a lo fun n ṣatunṣe aṣiṣe, ni lati fi si oniyipada idan lati igba de igba result esi ti ibeere ati ki o wo ohun ti o ṣẹlẹ. Ọna yii ko rọrun pupọ; o nilo lati rii daju pe ko si awọn ipalọlọ tabi awọn iṣẹ pẹlu eyi ni koodu lẹhin result tabi nìkan ọrọìwòye koodu ni isalẹ. Tabi o le, bii mi, gbagbe lati yọ ọpọlọpọ iru awọn ipe kuro lati ofin ti a ti ṣetan ati iyalẹnu idi ti ohunkohun ko ṣiṣẹ.

Ọna ti o rọrun diẹ sii ni lati pe ọna naa return pẹlu paramita ti a beere. Ni idi eyi, ipaniyan ti ofin yoo pari ati pe a yoo ni anfani lati wo ohun ti o ṣẹlẹ bi abajade ohun ti a kọ:

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

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

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

Iṣoro wiwọle

Awọn ipo wa nigbati o ko le wọle si ohun elo CxAudit (eyiti a lo lati kọ awọn ofin). Awọn idi pupọ le wa fun eyi, pẹlu awọn ipadanu, awọn imudojuiwọn Windows lojiji, BSOD ati awọn ipo airotẹlẹ miiran ti o kọja iṣakoso wa. Ni idi eyi, nigba miiran igba ti ko pari ni ibi ipamọ data, eyiti o ṣe idiwọ fun ọ lati wọle lẹẹkansi. Lati ṣatunṣe rẹ, o nilo lati ṣiṣe awọn ibeere pupọ:

Fun Checkmarx ṣaaju 8.6:

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

Fun Checkmarx lẹhin 8.6:

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

Awọn ofin kikọ

Bayi a gba si awọn julọ awon apa. Nigbati o ba bẹrẹ kikọ awọn ofin ni CxQL, ohun ti o ko ni igbagbogbo kii ṣe iwe pupọ bi diẹ ninu awọn apẹẹrẹ igbesi aye ti yanju awọn iṣoro kan ati ṣapejuwe ilana ti bii awọn ibeere ṣe n ṣiṣẹ ni gbogbogbo.

Emi yoo gbiyanju lati jẹ ki igbesi aye rọrun diẹ fun awọn ti o bẹrẹ lati besomi sinu ede ibeere ati fun ọpọlọpọ awọn apẹẹrẹ ti lilo Awọn ibeere Aṣa lati yanju awọn iṣoro kan. Diẹ ninu wọn jẹ gbogbogbo ati pe o le ṣee lo ninu ile-iṣẹ rẹ ni iṣe laisi awọn ayipada, awọn miiran jẹ pato diẹ sii, ṣugbọn wọn tun le ṣee lo nipa yiyipada koodu lati baamu awọn pato ti awọn ohun elo rẹ.

Nitorinaa, eyi ni awọn iṣoro ti a pade nigbagbogbo:

Iṣẹ kan: Awọn ṣiṣan pupọ wa ninu awọn abajade ti ṣiṣe ofin ati ọkan ninu wọn jẹ itẹ-ẹiyẹ miiran, o gbọdọ fi ọkan ninu wọn silẹ.

Solusan: Lootọ, nigbakan Checkmarx ṣafihan ọpọlọpọ awọn ṣiṣan data ti o le ni lqkan ati jẹ ẹya kuru ti awọn miiran. Ọna pataki kan wa fun iru awọn ọran Din Sisan. Da lori paramita naa, yoo yan sisan ti o kuru ju tabi gunjulo:

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

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

Iṣẹ kan: Faagun atokọ ti data ifura si eyiti ohun elo naa ṣe

Solusan: Checkmarx ni awọn ofin ipilẹ, awọn abajade eyiti o jẹ lilo nipasẹ ọpọlọpọ awọn ibeere miiran. Nipa afikun diẹ ninu awọn ofin wọnyi pẹlu data kan pato si ohun elo rẹ, o le mu awọn abajade ọlọjẹ rẹ dara lẹsẹkẹsẹ. Ni isalẹ jẹ ofin apẹẹrẹ lati jẹ ki o bẹrẹ:

General_privacy_violation_list

Jẹ ki a ṣafikun ọpọlọpọ awọn oniyipada ti a lo ninu ohun elo wa lati tọju alaye ifura:

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

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

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

Iṣẹ kan: Faagun atokọ ti awọn oniyipada pẹlu awọn ọrọ igbaniwọle

Solusan: Emi yoo ṣeduro lẹsẹkẹsẹ san ifojusi si ofin ipilẹ fun asọye awọn ọrọ igbaniwọle ni koodu ati fifi kun si atokọ ti awọn orukọ oniyipada ti a lo nigbagbogbo ni ile-iṣẹ rẹ.

Ọrọigbaniwọle_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);
	}
}

Iṣẹ kan: Ṣafikun awọn ilana ti a lo ti ko ṣe atilẹyin nipasẹ Checkmarx

Solusan: Gbogbo awọn ibeere ni Checkmarx ti pin nipasẹ ede, nitorinaa o nilo lati ṣafikun awọn ofin fun ede kọọkan. Ni isalẹ wa ni diẹ ninu awọn apẹẹrẹ ti iru awọn ofin.

Ti a ba lo awọn ile-ikawe ti o ṣe iranlowo tabi rọpo iṣẹ ṣiṣe boṣewa, wọn le ni irọrun ṣafikun si ofin ipilẹ. Lẹhinna gbogbo eniyan ti o lo yoo kọ ẹkọ lẹsẹkẹsẹ nipa awọn ifihan tuntun. Gẹgẹbi apẹẹrẹ, awọn ile-ikawe fun iwọle ni Android jẹ Timber ati Loggi. Ninu package ipilẹ, ko si awọn ofin fun idamo awọn ipe ti kii ṣe eto, nitorinaa ti ọrọ igbaniwọle tabi idanimọ igba wọle sinu akọọlẹ, a kii yoo mọ nipa rẹ. Jẹ ki a gbiyanju lati ṣafikun awọn asọye ti iru awọn ọna si awọn ofin Checkmarx.

Apẹẹrẹ koodu idanwo ti o nlo ile-ikawe Timber fun wíwọlé:

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

Ati pe eyi jẹ apẹẹrẹ ti ibeere kan fun Checkmarx, eyiti yoo gba ọ laaye lati ṣafikun asọye ti pipe awọn ọna gedu bi aaye ijade fun data lati ohun elo naa:

WaAndroidOutputs

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

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

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

Ati pe o tun le ṣafikun si ofin adugbo, ṣugbọn eyi ni ibatan taara si iwọle ni Android:

WaAndroidLog_Ojade

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

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

Paapaa, ti awọn ohun elo Android ba lo Alakoso iṣẹ fun iṣẹ asynchronous, o jẹ imọran ti o dara lati tun sọ fun Checkmarx nipa eyi nipa fifi ọna kan kun fun gbigba data lati iṣẹ-ṣiṣe naa. getInputData:

WaAndroidRead

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

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

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

Iṣẹ kan: Wiwa fun awọn data ifura ni plist fun iOS ise agbese

Solusan: iOS nigbagbogbo nlo awọn faili pataki pẹlu itẹsiwaju .plist lati tọju ọpọlọpọ awọn oniyipada ati iye. Titoju awọn ọrọ igbaniwọle, awọn ami ami, awọn bọtini ati awọn data ifura miiran ninu awọn faili wọnyi ko ṣe iṣeduro, nitori wọn le fa jade lati inu ẹrọ laisi awọn iṣoro eyikeyi.

Awọn faili Plist ni awọn ẹya ti ko han gbangba si oju ihoho, ṣugbọn ṣe pataki si Checkmarx. Jẹ ki a kọ ofin kan ti yoo wa data ti a nilo ki o sọ fun wa ti awọn ọrọ igbaniwọle tabi awọn ami ti mẹnuba ni ibikan.

Apeere iru faili kan, eyiti o ni ami-ami kan ninu fun ibaraẹnisọrọ pẹlu iṣẹ ẹhin:

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

Ati ofin kan fun Checkmarx, eyiti o ni ọpọlọpọ awọn nuances ti o yẹ ki o ṣe akiyesi nigba kikọ:

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

Iṣẹ kan: Wiwa alaye ni XML

Solusan: Checkmarx ni awọn iṣẹ ti o rọrun pupọ fun ṣiṣẹ pẹlu XML ati wiwa awọn iye, awọn ami, awọn abuda ati diẹ sii. Ṣugbọn, laanu, aṣiṣe kan wa ninu iwe nitori eyiti kii ṣe apẹẹrẹ kan ṣiṣẹ. Bíótilẹ o daju pe abawọn yii ti yọkuro ni ẹya tuntun ti iwe, ṣọra ti o ba lo awọn ẹya iṣaaju ti awọn iwe aṣẹ.

Eyi ni apẹẹrẹ ti ko tọ lati inu iwe:

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

Bi abajade ti igbiyanju ipaniyan, a yoo gba aṣiṣe pe All ko si iru ọna bẹẹ… Ati pe eyi jẹ otitọ, nitori pe aaye pataki kan wa, aaye ohun lọtọ fun lilo awọn iṣẹ fun ṣiṣẹ pẹlu XML - cxXPath. Eyi ni ohun ti ibeere to pe dabi lati wa eto kan ni Android ti o fun laaye lilo ijabọ HTTP:

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

Jẹ ki a wo ni alaye diẹ sii, niwọn igba ti sintasi fun gbogbo awọn iṣẹ jẹ iru, lẹhin ti o ti rii ọkan, lẹhinna o kan nilo lati yan eyi ti o nilo. Nitorinaa, lẹsẹsẹ ni ibamu si awọn paramita:

  • "*.xml"- boju-boju ti awọn faili lati wa

  • 8 - id ti ede ti ofin ti wa ni lilo

  • "cleartextTrafficPermitted"- orukọ ikalara ni xml

  • "true" - awọn iye ti yi ro pe

  • false - lilo ikosile deede nigba wiwa

  • true — tumọ si pe wiwa yoo ṣee ṣe laikọju ọran, iyẹn ni, ọran-aibikita

Gẹgẹbi apẹẹrẹ, a lo ofin kan ti o ṣe idanimọ ti ko tọ, lati oju-ọna aabo, awọn eto asopọ nẹtiwọọki ni Android ti o gba ibaraẹnisọrọ laaye pẹlu olupin nipasẹ ilana HTTP. Apẹẹrẹ eto ti o ni abuda kan ninu cleartextTrafficPermitted pẹlu itumo 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>

Iṣẹ kan: Idinwo awọn abajade nipasẹ orukọ faili / ọna

Solusan: Ninu ọkan ninu awọn iṣẹ akanṣe nla ti o ni ibatan si idagbasoke ohun elo alagbeka kan fun Android, a pade awọn idaniloju eke ti ofin ti o pinnu eto obfuscation. Otitọ ni pe ofin jade kuro ninu apoti wiwa ninu faili naa build.gradle eto ti o ni iduro fun lilo awọn ofin obfuscation fun ẹya itusilẹ ti ohun elo naa.

Ṣugbọn ni awọn iṣẹ akanṣe nla nigbakan awọn faili ọmọ wa build.gradle, eyiti o tọka si awọn ile-ikawe ti o wa ninu iṣẹ akanṣe naa. Iyatọ ni pe paapaa ti awọn faili wọnyi ko ba tọka iwulo fun obfuscation, awọn eto ti faili apejọ obi yoo lo lakoko iṣakojọpọ.

Bayi, iṣẹ-ṣiṣe ni lati ge awọn okunfa kuro ninu awọn faili ọmọde ti o jẹ ti awọn ile-ikawe. Wọn le ṣe idanimọ nipasẹ wiwa laini apply 'com.android.library'.

Apeere koodu lati faili build.gradle, eyiti o pinnu iwulo fun obfuscation:

apply plugin: 'com.android.application'

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

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

dependencies {
  ...
}

Faili apẹẹrẹ build.gradle fun ile-ikawe ti o wa ninu iṣẹ akanṣe ti ko ni eto yii:

apply plugin: 'android-library'

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

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

Ati ofin fun Checkmarx:

ProGuardObfuscationNotInLilo

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

Ọna yii le jẹ gbogbo agbaye ati iwulo kii ṣe fun awọn ohun elo Android nikan, ṣugbọn fun awọn ọran miiran nigbati o nilo lati pinnu boya abajade jẹ ti faili kan pato.

Iṣẹ kan: Ṣafikun atilẹyin fun ile-ikawe ẹnikẹta ti sintasi ko ba ni atilẹyin ni kikun

Solusan: Awọn nọmba ti awọn orisirisi awọn ilana ti o ti wa ni lilo ninu awọn ilana ti kikọ koodu ni nìkan pa awọn shatti. Nitoribẹẹ, Checkmarx ko nigbagbogbo mọ nipa aye wọn, ati pe iṣẹ-ṣiṣe wa ni lati kọ ọ lati loye pe awọn ọna kan jẹ pataki si ilana yii. Nigba miiran eyi jẹ idiju nipasẹ otitọ pe awọn ilana lo awọn orukọ iṣẹ ti o wọpọ pupọ ati pe ko ṣee ṣe lati pinnu lainidi ibatan ti ipe kan pato si ile-ikawe kan pato.

Iṣoro naa ni pe sintasi ti iru awọn ile-ikawe ko nigbagbogbo mọ ni deede ati pe o ni lati ṣe idanwo lati yago fun gbigba nọmba nla ti awọn idaniloju eke. Awọn aṣayan pupọ lo wa lati mu ilọsiwaju ọlọjẹ pọ si ati yanju iṣoro naa:

  • Aṣayan akọkọ, a mọ daju pe a lo ile-ikawe ni iṣẹ akanṣe kan ati pe o le lo ofin ni ipele ẹgbẹ. Ṣugbọn ti ẹgbẹ naa ba pinnu lati mu ọna ti o yatọ tabi lo ọpọlọpọ awọn ile-ikawe ninu eyiti awọn orukọ iṣẹ ṣiṣẹ pọ, a le gba aworan ti ko dun pupọ ti ọpọlọpọ awọn idaniloju eke.

  • Aṣayan keji ni lati wa awọn faili ninu eyiti ile-ikawe ti gbe wọle kedere. Pẹlu ọna yii, a le ni idaniloju pe ile-ikawe ti a nilo ni deede lo ninu faili yii.

  • Ati aṣayan kẹta ni lati lo awọn ọna meji ti o wa loke papọ.

Fun apẹẹrẹ, jẹ ki a wo ile-ikawe kan ti a mọ daradara ni awọn iyika dín tẹ fun ede siseto Scala, eyun, iṣẹ ṣiṣe Splicing Literal iye. Ni gbogbogbo, lati fi awọn paramita kọja si ibeere SQL, o gbọdọ lo oniṣẹ ẹrọ $, eyiti o paarọ data sinu ibeere SQL ti a ti ṣe tẹlẹ. Iyẹn ni, ni otitọ, o jẹ afọwọṣe taara ti Gbólóhùn Murasilẹ ni Java. Ṣugbọn, ti o ba nilo lati ṣe agbero ibeere SQL kan, fun apẹẹrẹ, ti o ba nilo lati kọja awọn orukọ tabili, o le lo oniṣẹ ẹrọ. #$, eyi ti yoo paarọ data taara sinu ibeere naa (fere bi asopọ okun).

Koodu apẹẹrẹ:

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

Checkmarx ko tii mọ bi o ṣe le ṣe awari lilo Awọn idiyele Literal Splicing ati fo awọn oniṣẹ #$, nitorina jẹ ki a gbiyanju lati kọ ọ lati ṣe idanimọ awọn abẹrẹ SQL ti o pọju ati ki o ṣe afihan awọn aaye ti o tọ ni koodu naa:

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

Iṣẹ kan: Wa awọn iṣẹ alailagbara ti a lo ninu awọn ile-ikawe Open-Orisun

Solusan: Ọpọlọpọ awọn ile-iṣẹ lo awọn irinṣẹ ibojuwo-Orisun (Iwa OSA) lati ṣawari lilo awọn ẹya ti o ni ipalara ti awọn ile-ikawe ni awọn ohun elo idagbasoke. Nigba miiran ko ṣee ṣe lati ṣe imudojuiwọn iru ile-ikawe si ẹya to ni aabo. Ni awọn igba miiran awọn idiwọn iṣẹ-ṣiṣe wa, ninu awọn miiran ko si ẹya ailewu rara. Ni ọran yii, apapọ awọn iṣe SAST ati OSA yoo ṣe iranlọwọ lati pinnu pe awọn iṣẹ ti o yori si ilokulo ti ailagbara ko lo ninu koodu naa.

Ṣugbọn nigbamiran, ni pataki nigbati o ba gbero JavaScript, eyi le ma jẹ iṣẹ-ṣiṣe bintin patapata. Ni isalẹ ni ojutu kan, boya ko bojumu, ṣugbọn sibẹsibẹ ṣiṣẹ, lilo apẹẹrẹ ti awọn ailagbara ninu paati lodash ni awọn ọna template и *set.

Awọn apẹẹrẹ ti idanwo koodu alailagbara ninu faili JS kan:

/**
 * 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!'

Ati nigbati o ba sopọ taara ni 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>

A n wa gbogbo awọn ọna ipalara wa, eyiti a ṣe akojọ si ni awọn ailagbara:

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

Iṣẹ kan: Wiwa awọn iwe-ẹri ti a fi sii ninu ohun elo naa

Solusan: Kii ṣe loorekoore fun awọn ohun elo, paapaa awọn alagbeka, lati lo awọn iwe-ẹri tabi awọn bọtini lati wọle si awọn olupin oriṣiriṣi tabi jẹrisi SSL-Pinning. Lati irisi aabo, titoju iru nkan bẹ ni koodu kii ṣe iṣe ti o dara julọ. Jẹ ki a gbiyanju lati kọ ofin kan ti yoo wa awọn faili ti o jọra ni ibi ipamọ:

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

Iṣẹ kan: Wiwa awọn ami ti o gbogun ninu ohun elo naa

Solusan: Nigbagbogbo o jẹ dandan lati fagilee awọn ami ti o gbogun tabi alaye pataki miiran ti o wa ninu koodu naa. Nitoribẹẹ, titoju wọn sinu koodu orisun kii ṣe imọran to dara, ṣugbọn awọn ipo yatọ. Ṣeun si awọn ibeere CxQL, wiwa awọn nkan bii eyi rọrun pupọ:

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

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

ipari

Mo nireti pe nkan yii yoo wulo fun awọn ti o bẹrẹ ifaramọ wọn pẹlu ọpa Checkmarx. Boya awọn ti o ti nkọ awọn ofin ti ara wọn fun igba pipẹ yoo tun wa nkan ti o wulo ninu itọsọna yii.

Laanu, lọwọlọwọ aini awọn orisun wa nibiti awọn imọran tuntun le ṣe ikojọpọ lakoko idagbasoke awọn ofin fun Checkmarx. Ti o ni idi ti a ṣẹda ibi ipamọ lori Github, nibi ti a o ti fi ise wa ranse ki gbogbo eniyan ti o ba lo CxQL le ri nkan ti o wulo ninu re, ki o si tun ni anfaani lati pin ise won pelu awujo. Ibi ipamọ wa ninu ilana ti kikun ati akoonu akoonu, nitorinaa awọn oluranlọwọ ṣe itẹwọgba!

Ṣayẹwo bayi!

orisun: www.habr.com

Fi ọrọìwòye kun