Momwe mungalembe malamulo a Checkmarx osapenga

Pa Habr!

Pantchito yathu, kampani yathu nthawi zambiri imachita ndi zida zosiyanasiyana zowunikira ma static code (SAST). Mu bokosi onse amagwira ntchito avareji. Zoonadi, zonse zimadalira pulojekitiyi ndi matekinoloje omwe amagwiritsidwa ntchito mmenemo, komanso momwe matekinolojewa amagwiritsidwira ntchito ndi malamulo a kusanthula. M'malingaliro anga, chimodzi mwazofunikira kwambiri posankha chida cha SAST ndikutha kuchisintha kuti chigwirizane ndi zomwe mukufuna, monga kulemba ndikusintha malamulo owunikira kapena, monga momwe amatchulidwira, Custom Queries.

Momwe mungalembe malamulo a Checkmarx osapenga

Nthawi zambiri timagwiritsa ntchito Checkmarx - chowunikira chosangalatsa komanso champhamvu. M'nkhaniyi ine kulankhula za zinandichitikira kulemba kusanthula malamulo kwa izo.

Zamkatimu

kulowa

Poyamba, ndikufuna kupangira imodzi mwazolemba zochepa mu Chirasha zokhudzana ndi zolemba za Checkmarx. Idasindikizidwa pa Habré kumapeto kwa 2019 pansi pamutu wakuti: "Moni, Checkmarx!" Momwe mungalembe funso la Checkmarx SAST ndikupeza zofooka zabwino.

Imawunika mwatsatanetsatane momwe mungalembe mafunso oyamba mu CxQL (Checkmarx Query Language) pakugwiritsa ntchito mayeso ndikuwonetsa mfundo zoyambira momwe malamulo owunikira amagwirira ntchito.

Sindidzabwereza zomwe zalongosoledwa mmenemo, ngakhale kuti mphambano zina zidzakhalapobe. M'nkhani yanga ndiyesera kupanga mtundu wa "zosonkhanitsa maphikidwe", mndandanda wa zothetsera mavuto omwe ndinakumana nawo pa ntchito yanga ndi Checkmarx. Ndinayenera kugwedeza ubongo wanga pa ambiri mwa mavutowa. Nthaŵi zina m’zolembedwazo munalibe chidziŵitso chokwanira, ndipo nthaŵi zina zinali zovuta kumvetsa mmene tingachitire zimene zimafunikira. Ndikukhulupirira kuti zomwe ndakumana nazo komanso kugona usiku sizikhala pachabe, ndipo "kusonkhanitsa maphikidwe a Custom Queries" kudzakupulumutsirani maola angapo kapena ma cell angapo amisempha. Kotero, tiyeni tiyambe!

Zambiri pamalamulo

Choyamba, tiyeni tiwone mfundo zingapo zofunika ndi ndondomeko yogwirira ntchito ndi malamulo, kuti timvetse bwino zomwe zidzachitike. Komanso chifukwa zolembazo sizikunena chilichonse chokhudza izi kapena zimafalikira kwambiri pamapangidwe, zomwe sizothandiza kwambiri.

  1. Malamulowa amagwiritsidwa ntchito pakusanthula kutengera zomwe zasankhidwa poyambira (malamulo okhazikika). Mukhoza kupanga chiwerengero chosawerengeka cha presets, ndi momwe mungapangire izo zimatengera ndondomeko yanu. Mutha kuziyika m'magulu mwachilankhulo kapena kusankha zokonzeratu pa polojekiti iliyonse. Chiwerengero cha malamulo yogwira zimakhudza liwiro ndi kulondola kwa sikani.

    Momwe mungalembe malamulo a Checkmarx osapengaKukhazikitsa Preset mu mawonekedwe a Checkmarx

  2. Malamulowa amasinthidwa mu chida chapadera chotchedwa CxAuditor. Iyi ndi pulogalamu yapakompyuta yomwe imalumikizana ndi seva yomwe ikuyenda Checkmarx. Chida ichi chili ndi njira ziwiri zogwirira ntchito: malamulo osintha ndikuwunika zotsatira za sikani yomwe yachitika kale.

    Momwe mungalembe malamulo a Checkmarx osapengaCxAudit mawonekedwe

  3. Malamulo mu Checkmarx amagawidwa ndi chilankhulo, ndiye kuti, chilankhulo chilichonse chimakhala ndi mafunso ake. Palinso malamulo ena onse omwe amagwira ntchito mosasamala chilankhulo, awa ndi omwe amatchedwa mafunso ofunikira. Nthawi zambiri, mafunso ofunikira amaphatikizapo kufufuza zambiri zomwe malamulo ena amagwiritsa ntchito.

    Momwe mungalembe malamulo a Checkmarx osapengaKugawa malamulo ndi zilankhulo

  4. Malamulo ndi "Executable" ndi "Non-Executable" (Ophedwa ndi Osaphedwa). Osati dzina lolondola, m'malingaliro anga, koma ndi momwe liriri. Mfundo yaikulu ndi yakuti zotsatira zotsatila malamulo a "Executable" zidzawonetsedwa muzotsatira za UI, ndipo malamulo a "Non-Executable" amafunikira kuti agwiritse ntchito zotsatira zawo pazopempha zina (makamaka, ntchito chabe).

    Momwe mungalembe malamulo a Checkmarx osapengaKusankha mtundu waulamuliro popanga

  5. Mutha kupanga malamulo atsopano kapena kuwonjezera / kulembanso omwe alipo. Kuti mulembenso lamulo, muyenera kulipeza mumtengo, dinani kumanja ndikusankha "Override" kuchokera pamenyu yotsitsa. Ndikofunika kukumbukira apa kuti malamulo atsopanowo sanaphatikizidwe muzokonzedweratu ndipo sakugwira ntchito. Kuyamba kugwiritsa ntchito iwo muyenera yambitsa mu "Preset Manager" menyu mu chida. Malamulo olembedwanso amasunga zoikamo zawo, ndiye kuti, ngati lamuloli likugwira ntchito, likhalabe choncho ndipo lidzagwiritsidwa ntchito nthawi yomweyo.

    Momwe mungalembe malamulo a Checkmarx osapengaChitsanzo cha lamulo latsopano mu mawonekedwe a Preset Manager

  6. Panthawi ya kuphedwa, "mtengo" wa zopempha umamangidwa, zomwe zimadalira chiyani. Malamulo omwe amasonkhanitsa zambiri amachitidwa poyamba, ndipo omwe amawagwiritsa ntchito kachiwiri. Zotsatira zakupha zimasungidwa, kotero ngati n'kotheka kugwiritsa ntchito zotsatira za lamulo lomwe liripo, ndiye kuti ndi bwino kutero, izi zidzachepetsa nthawi yojambula.

  7. Malamulo angagwiritsidwe ntchito pamagulu osiyanasiyana:

  • Kwa dongosolo lonse - lidzagwiritsidwa ntchito pakupanga sikani iliyonse ya polojekiti iliyonse

  • Pagulu lamagulu (Timu) - idzagwiritsidwa ntchito kusanthula mapulojekiti omwe asankhidwa.

  • Pa mlingo wa polojekiti - Idzagwiritsidwa ntchito mu polojekiti inayake

    Momwe mungalembe malamulo a Checkmarx osapengaKusankha mlingo umene lamulo lidzagwiritsidwa ntchito

"Dictionary" kwa oyamba kumene

Ndipo ndiyamba ndi zinthu zingapo zomwe zinandiyambitsa mafunso, ndipo ndiwonetsanso njira zingapo zomwe zingapangitse moyo kukhala wosalira zambiri.

Zochita ndi mindandanda

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

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

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

Zinthu zonse zopezeka

M'chinenero chojambulidwa, mutha kupeza mndandanda wazinthu zonse zomwe Checkmarx yazindikira (zingwe, ntchito, makalasi, njira, ndi zina). Uwu ndi danga lina la zinthu zomwe zitha kupezeka kudzera All. Ndiko kuti, kufufuza chinthu chokhala ndi dzina linalake searchMe, mutha kusaka, mwachitsanzo, ndi mayina pazopezeka zonse:

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

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

Koma, ngati mukufuna kusaka muchilankhulo china chomwe sichinaphatikizidwe pazifukwa zina (mwachitsanzo, groovy mu pulojekiti ya Android), mutha kukulitsa malo athu azinthu kudzera mukusintha:

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

Ntchito za Flow kusanthula

Izi zimagwiritsidwa ntchito m'malamulo ambiri ndipo nali pepala lachinyengo la zomwe akutanthauza:

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

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

Kupeza dzina la fayilo/njira

Pali zikhumbo zingapo zomwe zingapezeke kuchokera ku zotsatira za funso (dzina la fayilo yomwe cholemberacho chinapezedwa, chingwe, ndi zina zotero), koma zolembazo sizikunena momwe mungapezere ndi kuzigwiritsa ntchito. Chifukwa chake, kuti muchite izi, muyenera kulowa LinePragma katundu ndi zinthu zomwe tikufuna zidzakhala mkati mwake:

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

Ndikoyenera kukumbukira zimenezo FileName lili ndi njira yopita ku fayilo, popeza tidagwiritsa ntchito njirayo GetFirstGraph.

Chotsatira

Pali kusintha kwapadera mkati mwa CxQL result, zomwe zimabweretsa zotsatira zakuchita lamulo lanu lolemba. Zimayambitsidwa nthawi yomweyo ndipo mutha kulemba zotsatira zapakatikati momwemo, kuzisintha ndikuzikonza mukamagwira ntchito. Koma, ngati palibe ntchito ku kusinthaku kapena ntchito mkati mwa lamulo return- zotsatira zake zidzakhala ziro nthawi zonse.

Funso lotsatirali silidzatibwezera chilichonse chifukwa cha kuphedwa ndipo lidzakhala lopanda kanthu:

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

Koma, titapereka zotsatira zakupha pazotsatira zamatsenga, tiwona zomwe kuitana uku kumatibwerera:

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

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

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

Kugwiritsa ntchito zotsatira za malamulo ena

Malamulo mu Checkmarx amatha kutchedwa ofanana ndi magwiridwe antchito m'chinenero chokhazikika. Polemba lamulo, mutha kugwiritsa ntchito zotsatira za mafunso ena. Mwachitsanzo, palibe chifukwa chofufuza njira zonse zoyimbira mu code nthawi zonse, ingoyimbirani lamulo lomwe mukufuna:

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

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

Njirayi imakulolani kuti mufupikitse kachidindo ndikuchepetsa kwambiri nthawi yoyendetsera malamulo.

Kuthetsa mavuto

Kudula mitengo

Pogwira ntchito ndi chida, nthawi zina sizingatheke kulemba funso lomwe mukufuna ndipo muyenera kuyesa, kuyesa njira zosiyanasiyana. Pazifukwa zotere, chida chimapereka mitengo, yomwe imatchedwa motere:

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

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

Koma ndi bwino kukumbukira kuti njira imeneyi amangovomereza monga kulowetsamo chingwe, kotero sizingatheke kuwonetsa mndandanda wazinthu zomwe zapezeka chifukwa cha ntchito yoyamba. Njira yachiwiri, yomwe imagwiritsidwa ntchito pochotsa zolakwika, ndikugawira kusintha kwamatsenga nthawi ndi nthawi result zotsatira za funso ndikuwona zomwe zikuchitika. Njira iyi si yabwino kwambiri; muyenera kuwonetsetsa kuti palibe zowonjezera kapena ntchito ndi izi mu code pambuyo pake. result kapena ingoyankhani ndemanga pansipa. Kapena mungathe, monga ine, kuiwala kuchotsa mafoni angapo otere kuchokera ku lamulo lokonzekera ndikudabwa chifukwa chake palibe chomwe chimagwira ntchito.

Njira yosavuta ndiyo kuyitana njira return ndi parameter yofunikira. Pankhaniyi, kukwaniritsidwa kwa lamuloli kutha ndipo titha kuwona zomwe zidachitika chifukwa cha zomwe tidalemba:

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

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

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

Vuto lolowera

Pali zochitika zomwe simungathe kupeza chida cha CxAudit (chomwe chimagwiritsidwa ntchito polemba malamulo). Pakhoza kukhala zifukwa zambiri za izi, kuphatikizapo kuwonongeka, zosintha za Windows mwadzidzidzi, BSOD ndi zina zosayembekezereka zomwe sitingathe kuzilamulira. Pankhaniyi, nthawi zina pamakhala gawo losamalizidwa mu database, zomwe zimakulepheretsani kulowanso. Kuti mukonze, muyenera kufunsa mafunso angapo:

Kwa Checkmarx isanafike 8.6:

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

Kwa Checkmarx pambuyo pa 8.6:

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

Malamulo olembera

Tsopano tikufika ku gawo losangalatsa kwambiri. Mukayamba kulemba malamulo mu CxQL, zomwe mumasowa nthawi zambiri sizikhala zolemba zambiri monga zitsanzo zamoyo zothetsera mavuto ena ndikufotokozera momwe mafunso amagwirira ntchito nthawi zonse.

Ndiyesetsa kupangitsa moyo kukhala wosavuta kwa iwo omwe akuyamba kulowa m'chinenero cha mafunso ndikupereka zitsanzo zingapo zogwiritsira ntchito Custom Queries kuthetsa mavuto ena. Zina mwazo ndizambiri ndipo zitha kugwiritsidwa ntchito pakampani yanu popanda zosintha, zina ndizokhazikika, koma zitha kugwiritsidwanso ntchito posintha ma code kuti agwirizane ndi zomwe mukufuna.

Kotero, apa pali mavuto omwe timakumana nawo nthawi zambiri:

Ntchito: Pali Mayendedwe angapo pazotsatira zakuchita lamuloli ndipo imodzi mwazo ndi zisa za inzake, muyenera kusiya imodzi mwazo.

yankho; Zowonadi, nthawi zina Checkmarx imawonetsa kusuntha kwa data komwe kumatha kupindika ndikukhala kufupikitsidwa kwa ena. Pali njira yapadera pazochitika zoterezi ReduceFlow. Kutengera ndi parameter, imasankha Kuyenda kwakufupi kapena kotalika:

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

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

Ntchito: Wonjezerani mndandanda wazinthu zodziwika bwino zomwe chidachi chimagwira

yankho; Checkmarx ili ndi malamulo oyambira, zotsatira zake zimagwiritsidwa ntchito ndi mafunso ena ambiri. Powonjezera ena mwa malamulowa ndi deta yokhudzana ndi pulogalamu yanu, mutha kusintha zotsatira zanu nthawi yomweyo. Pansipa pali lamulo lachitsanzo kuti muyambe:

General_privacy_violation_list

Tiyeni tiwonjezere zosintha zingapo zomwe zimagwiritsidwa ntchito posunga zidziwitso zachinsinsi:

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

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

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

Ntchito: Wonjezerani mndandanda wazosintha ndi mawu achinsinsi

yankho; Ndikupangira kuti musamalire nthawi yomweyo lamulo lofotokozera mawu achinsinsi mu code ndikuwonjezerapo mndandanda wa mayina osinthika omwe amagwiritsidwa ntchito kwambiri pakampani yanu.

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

Ntchito: Onjezani zomangira zomwe sizimathandizidwa ndi Checkmarx

yankho; Mafunso onse mu Checkmarx amagawidwa ndi zilankhulo, chifukwa chake muyenera kuwonjezera malamulo achilankhulo chilichonse. M'munsimu muli zitsanzo za malamulo amenewa.

Ngati malaibulale agwiritsidwa ntchito omwe amathandizira kapena kusintha magwiridwe antchito, amatha kuwonjezeredwa ku lamulo loyambira. Kenako aliyense amene aigwiritsa ntchito adzaphunzira mwamsanga za mawu oyamba atsopano. Mwachitsanzo, malaibulale olowera mu Android ndi Timber ndi Loggi. Mu phukusi loyambira, palibe malamulo ozindikiritsa mafoni omwe si a dongosolo, kotero ngati chizindikiritso kapena chizindikiritso cha gawo chilowa mu chipika, sitidzadziwa. Tiyeni tiyese kuwonjezera matanthauzo a njira zoterezi ku malamulo a Checkmarx.

Chitsanzo choyesera chomwe chimagwiritsa ntchito laibulale ya Timber podula mitengo:

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

Ndipo nachi chitsanzo cha pempho la Checkmarx, lomwe limakupatsani mwayi wowonjezera tanthauzo lakuyimbira njira za Timber ngati njira yotulutsira deta kuchokera pakugwiritsa ntchito:

FindAndroidOutputs

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

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

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

Ndipo mutha kuwonjezeranso ku lamulo loyandikana nalo, koma ili likukhudzana mwachindunji ndi kulowa mu Android:

PezaniAndroidLog_Outputs

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

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

Komanso, ngati ntchito Android ntchito Woyang'anira Ntchito pa ntchito yofananira, ndibwino kudziwitsanso Checkmarx za izi powonjezera njira yopezera deta kuchokera pa ntchitoyi. getInputData:

PezaniAndroidRead

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

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

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

Ntchito: Kusaka data tcheru mu plist yamapulojekiti a iOS

yankho; iOS nthawi zambiri imagwiritsa ntchito mafayilo apadera ndi .plist extension kuti asunge zosiyana ndi zofunikira. Kusunga mapasiwedi, zizindikiro, makiyi ndi zina tcheru deta mu owona awa sikovomerezeka, chifukwa akhoza yotengedwa chipangizo popanda vuto lililonse.

Mafayilo a Plist ali ndi mawonekedwe omwe sawonekera, koma ndikofunikira ku Checkmarx. Tiyeni tilembe lamulo lomwe lidzafufuze zomwe tikufuna ndikutiuza ngati mawu achinsinsi kapena zizindikiro zimatchulidwa kwinakwake.

Chitsanzo cha fayilo yotereyi, yomwe ili ndi chizindikiro cholumikizirana ndi ntchito yakumbuyo:

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

Ndipo lamulo la Checkmarx, lomwe lili ndi ma nuances angapo omwe ayenera kuganiziridwa polemba:

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

Ntchito: Kupeza Zambiri mu XML

yankho; Checkmarx ili ndi ntchito zosavuta zogwirira ntchito ndi XML ndikusaka makonda, ma tag, mawonekedwe ndi zina zambiri. Koma, mwatsoka, panali zolakwika pazolembedwa chifukwa palibe chitsanzo chimodzi chomwe chimagwira ntchito. Ngakhale kuti vutoli lathetsedwa muzolemba zaposachedwa, samalani ngati mugwiritsa ntchito zolemba zakale.

Nachi chitsanzo cholakwika kuchokera pazolembedwa:

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

Chifukwa cha kuyesa kuphedwa, tidzalandira cholakwika chomwe All palibe njira yotere ... Ndipo izi ndi zoona, popeza pali malo apadera, osiyana ogwiritsira ntchito ntchito zogwirira ntchito ndi XML - cxXPath. Umu ndi momwe funso lolondola limawoneka ngati kupeza zosintha mu Android zomwe zimalola kugwiritsa ntchito HTTP traffic:

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

Tiyeni tiwone mwatsatanetsatane, popeza mawu amtundu wa ntchito zonse ndi ofanana, mutatha kulingalira chimodzi, mumangofunika kusankha yomwe mukufuna. Choncho, sequentially malinga ndi magawo:

  • "*.xml"- chigoba cha mafayilo kuti afufuzidwe

  • 8 - ID ya chilankhulo chomwe lamuloli likugwiritsidwira ntchito

  • "cleartextTrafficPermitted"- dzina lachidziwitso mu xml

  • "true" - mtengo wa chikhalidwe ichi

  • false - kugwiritsa ntchito mawu okhazikika pofufuza

  • true - zikutanthauza kuti kusaka kudzachitidwa mosasamala, ndiye kuti, mosaganizira

Mwachitsanzo, tidagwiritsa ntchito lamulo lomwe limazindikiritsa zolakwika, kuchokera pamalingaliro achitetezo, zoikamo zolumikizira netiweki mu Android zomwe zimalola kulumikizana ndi seva kudzera pa protocol ya HTTP. Chitsanzo cha makonda omwe ali ndi malingaliro cleartextTrafficPermitted ndi tanthauzo 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>

Ntchito: Chepetsani zotsatira ndi dzina la fayilo/njira

yankho; Mu imodzi mwama projekiti akuluakulu okhudzana ndi kakulidwe ka pulogalamu yam'manja ya Android, tidakumana ndi zabodza zamalamulo omwe amatsimikizira mawonekedwe a obfuscation. Chowonadi ndi chakuti lamulo lotuluka m'bokosi limasaka mufayilo build.gradle makonda omwe ali ndi udindo wogwiritsa ntchito malamulo obisa mawu amtundu wa pulogalamuyo.

Koma muzinthu zazikulu nthawi zina pamakhala mafayilo a ana build.gradle, zomwe zimanena za malaibulale omwe akuphatikizidwa mu polojekitiyi. Chodabwitsa ndichakuti ngakhale mafayilowa sakuwonetsa kufunikira kwa kusokoneza, makonda a fayilo ya msonkhano wa makolo adzagwiritsidwa ntchito pakuphatikiza.

Chifukwa chake, ntchitoyo ndikudula zoyambitsa m'mafayilo a ana omwe ali m'malaibulale. Iwo akhoza kudziwika ndi kukhalapo kwa mzere apply 'com.android.library'.

Chitsanzo code kuchokera file build.gradle, zomwe zimatsimikizira kufunikira kwa obfuscation:

apply plugin: 'com.android.application'

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

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

dependencies {
  ...
}

Fayilo yachitsanzo build.gradle kwa laibulale yomwe ili mu projekiti yomwe ilibe izi:

apply plugin: 'android-library'

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

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

Ndipo lamulo la 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);
		}
	}
}

Njirayi imatha kukhala yapadziko lonse lapansi komanso yothandiza osati pamapulogalamu a Android okha, komanso pamilandu ina mukafunika kudziwa ngati zotsatira zake ndi fayilo inayake.

Ntchito: Onjezani chithandizo chalaibulale ya anthu ena ngati mawuwo sakuthandizidwa mokwanira

yankho; Chiwerengero cha ma frameworks osiyanasiyana omwe amagwiritsidwa ntchito polemba ma code amangochoka pama chart. Zachidziwikire, Checkmarx samadziwa nthawi zonse za kukhalapo kwawo, ndipo ntchito yathu ndikuyiphunzitsa kuti imvetsetse kuti njira zina ndi za chimangochi. Nthawi zina izi zimakhala zovuta chifukwa chakuti ma frameworks amagwiritsa ntchito mayina a ntchito omwe ali ofala kwambiri ndipo ndizosatheka kudziwa mosakayikira mgwirizano wa foni inayake ku laibulale inayake.

Chovuta ndichakuti kalembedwe ka malaibulale otere samadziwika bwino nthawi zonse ndipo muyenera kuyesa kuti mupewe kupeza zambiri zabodza. Pali njira zingapo zosinthira kulondola kwa sikani ndi kuthetsa vutoli:

  • Njira yoyamba, tikudziwa motsimikiza kuti laibulale imagwiritsidwa ntchito pa ntchito inayake ndipo ingagwiritse ntchito lamulo pamagulu a gulu. Koma ngati gulu lisankha kuchita njira ina kapena kugwiritsa ntchito malaibulale angapo momwe mayina amagwirira ntchito, titha kupeza chithunzi chosasangalatsa cha zabwino zambiri zabodza.

  • Njira yachiwiri ndikufufuza mafayilo omwe laibulale imatumizidwa momveka bwino. Ndi njira iyi, titha kukhala otsimikiza kuti laibulale yomwe tikufuna ikugwiritsidwa ntchito mufayiloyi.

  • Ndipo njira yachitatu ndiyo kugwiritsa ntchito njira ziwirizi pamodzi.

Mwachitsanzo, tiyeni tiwone laibulale yodziwika bwino m'magulu opapatiza wofatsa kwa chilankhulo cha Scala, chomwe ndi magwiridwe antchito Kuphatikiza Makhalidwe Abwino. Kawirikawiri, kuti mupereke magawo ku funso la SQL, muyenera kugwiritsa ntchito woyendetsa $, zomwe zimalowetsa deta muzofunsa za SQL zokonzedweratu. Izi ndiye kuti, ndi analogi achindunji a Prepared Statement ku Java. Koma, ngati mukufuna kupanga funso la SQL mwamphamvu, mwachitsanzo, ngati mukufuna kupereka mayina a tebulo, mutha kugwiritsa ntchito #$, zomwe zidzalowe m'malo mwachidziwitso mufunso (pafupifupi ngati kugwirizanitsa zingwe).

Chitsanzo kodi:

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

Checkmarx sakudziwabe momwe angazindikire kugwiritsa ntchito Splicing Literal Values ​​​​ndikudumpha oyendetsa #$, kotero tiyeni tiyese kuphunzitsa kuti tizindikire majekeseni a SQL omwe angakhalepo ndikuwunikira malo oyenera mu code:

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

Ntchito: Sakani ntchito zomwe zikugwiritsidwa ntchito pachiwopsezo mumalaibulale a Open Source

yankho; Makampani ambiri amagwiritsa ntchito zida zowunikira za Open-Source (OSA) kuti azindikire kugwiritsidwa ntchito kwa malaibulale omwe ali pachiwopsezo pamapulogalamu opangidwa. Nthawi zina sikutheka kusinthira laibulale yoteroyo kukhala yotetezeka. Nthawi zina pali zoletsa zogwirira ntchito, zina palibe njira yotetezeka konse. Pachifukwa ichi, kuphatikiza kwa machitidwe a SAST ndi OSA kudzathandiza kudziwa kuti ntchito zomwe zimayambitsa kugwiritsira ntchito chiwopsezo sizikugwiritsidwa ntchito mu code.

Koma nthawi zina, makamaka poganizira JavaScript, izi sizingakhale ntchito yaing'ono. Pansipa pali yankho, mwina osati labwino, koma likugwira ntchito, pogwiritsa ntchito chitsanzo cha zofooka mu gawoli. lodash mu njira template и *set.

Zitsanzo zamakhodi omwe angakhale pachiwopsezo mu fayilo ya 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!'

Ndipo mukalumikiza mwachindunji mu 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>

Tikuyang'ana njira zathu zonse zomwe zili pachiwopsezo, zomwe zili pachiwopsezo:

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

Ntchito: Kusaka masatifiketi ophatikizidwa mu pulogalamuyi

yankho; Si zachilendo kuti mapulogalamu, makamaka mafoni, agwiritse ntchito ziphaso kapena makiyi kuti apeze ma seva osiyanasiyana kapena kutsimikizira SSL-Pinning. Kuchokera pamalingaliro achitetezo, kusunga zinthu zotere mu code si njira yabwino kwambiri. Tiyeni tiyese kulemba lamulo lomwe lidzafufuze mafayilo ofanana munkhokwe:

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

Ntchito: Kupeza ma tokeni osokonekera mu pulogalamuyi

yankho; Nthawi zambiri pamafunika kubweza ma tokeni osokonekera kapena chidziwitso china chofunikira chomwe chili mu code. Inde, kuwasunga mkati mwa code source si lingaliro labwino, koma zinthu zimasiyana. Chifukwa cha mafunso a CxQL, kupeza zinthu ngati izi ndikosavuta:

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

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

Pomaliza

Ndikukhulupirira kuti nkhaniyi ithandiza kwa iwo omwe akuyamba kudziwana ndi chida cha Checkmarx. Mwinamwake iwo omwe akhala akulemba malamulo awo kwa nthawi yaitali adzapezanso zothandiza mu bukhuli.

Tsoka ilo, pakadali pano kusowa kwazinthu komwe malingaliro atsopano angatengedwe panthawi yopanga malamulo a Checkmarx. Ndi chifukwa chake tinapanga posungira pa Github, komwe tidzayika ntchito yathu kuti aliyense amene amagwiritsa ntchito CxQL apeze chinachake chothandiza mmenemo, komanso kukhala ndi mwayi wogawana ntchito yawo ndi anthu ammudzi. Malo osungiramo zinthuwa ali mkati modzaza ndi kukonza zomwe zili, kotero opereka ndiwolandiridwa!

Zikomo chifukwa cha chidwi chanu!

Source: www.habr.com

Kuwonjezera ndemanga