Maitiro ekunyora mitemo yeCheckmarx pasina kupenga

Hei Habr!

Mubasa redu, kambani yedu kazhinji inobata neakasiyana static kodhi yekuongorora maturusi (SAST). Kunze kwebhokisi vese vanoshanda pakati. Zvechokwadi, zvose zvinoenderana neprojekti uye matekinoroji anoshandiswa mairi, uyewo kuti zvakanaka sei teknolojia iyi yakafukidzwa nemitemo yekuongorora. Sekuona kwangu, imwe yeanonyanya kukosha maitiro pakusarudza SAST chishandiso kugona kuigadzirisa kune chaiyo yezvikumbiro zvako, zvinoti, kunyora uye shandura mitemo yekuongorora kana, sezvavanowanzo kunzi, Tsika Mibvunzo.

Maitiro ekunyora mitemo yeCheckmarx pasina kupenga

Isu tinowanzo shandisa Checkmarx - inonakidza uye ine simba kodhi analyzer. Muchikamu chino ini ndichataura nezve ruzivo rwangu rwekunyora mitemo yekuongorora kwayo.

Tafura yezvinyorwa

kupinda

Kutanga, ndinoda kukurudzira chimwe chezvinyorwa zvishoma muRussia nezve maficha ekunyora mibvunzo yeCheckmarx. Yakaburitswa paHabré pakupera kwa2019 pasi pezita: "Mhoro, Checkmarx!" Maitiro ekunyora mubvunzo weCheckmarx SAST uye uwane kusagadzikana kwakanaka.

Inoongorora zvakadzama manyorerwo ekutanga mibvunzo muCxQL (Checkmarx Query Mutauro) kune imwe bvunzo application uye inoratidza misimboti yekuti mitemo yekuongorora inoshanda sei.

Ini handisi kuzodzokorora zvinotsanangurwa mairi, kunyangwe dzimwe nzira dzichiripo. Muchinyorwa changu ini ndichaedza kuunganidza rudzi rwe "kuunganidza kwekubika", rondedzero yemhinduro kumatambudziko chaiwo andakasangana nawo panguva yebasa rangu neCheckmarx. Ndaifanira kukwenya pfungwa dzangu pamusoro peakawanda ematambudziko aya. Dzimwe nguva pakanga pasina ruzivo rwakakwana muzvinyorwa, uye dzimwe nguva zvakanga zvakaoma kunzwisisa maitirwo aidiwa. Ndinovimba ruzivo rwangu nehusiku hwekusarara hachizove pasina, uye iyi "kuunganidzwa kweCustom Queries mabikirwo" ichakuchengetedza maawa mashoma kana akati wandei masero etsinga. Saka, ngatitange!

General ruzivo pamusoro pemitemo

Kutanga, ngatitarisei pfungwa shoma shoma uye nzira yekushanda nemitemo, kuti tinzwisise zviri nani zvichaitika mberi. Uye zvakare nekuti magwaro haatauri chero chinhu pamusoro peizvi kana kuti akapararira zvakanyanya muchimiro, izvo zvisiri nyore.

  1. Mitemo inoshandiswa panguva yekuongorora zvichienderana neyakagadzirirwa yakasarudzwa pakutanga (seti yemitemo inoshanda). Iwe unogona kugadzira huwandu husina muganho hwe presets, uye chaizvo magadzirirwo azvo zvinoenderana neiyo chaiyo maitiro ako. Unogona kuzvibatanidza nemutauro kana kusarudza presets epurojekiti yega yega. Nhamba yemitemo inoshanda inokanganisa kukurumidza uye kurongeka kwekuongorora.

    Maitiro ekunyora mitemo yeCheckmarx pasina kupengaKumisikidza Preset muCheckmarx interface

  2. Mitemo inogadziriswa mune yakakosha chishandiso chinonzi CxAuditor. Iyi idesktop application inobatanidza kune server inoshandisa Checkmarx. Ichi chishandiso chine nzira mbiri dzekushanda: mitemo yekugadzirisa uye kuongorora mhedzisiro yeyakatoitwa scan.

    Maitiro ekunyora mitemo yeCheckmarx pasina kupengaCxAudit interface

  3. Mitemo muCheckmarx yakakamurwa nemutauro, kureva kuti, mutauro wega wega une seti yemibvunzo. Kune zvakare mimwe mitemo yakajairika inoshanda zvisinei nemutauro, iyi ndiyo inonzi ma basic queries. Kazhinji, mibvunzo yakakosha inosanganisira kutsvaga ruzivo runoshandiswa nemimwe mitemo.

    Maitiro ekunyora mitemo yeCheckmarx pasina kupengaKupatsanura mitemo nemutauro

  4. Mitemo ndeye "Executable" uye "Isingaite" (Yakaitwa uye Haina Kuurayiwa). Harisi iro zita chairo, mumaonero angu, asi ndizvo zvariri. Chinonyanya kukosha ndechekuti mhedzisiro yekuita "Executable" mitemo icharatidzwa mune scanner zvabuda muUI, uye "Non-Executable" mitemo inodiwa chete kushandisa mhedzisiro yavo mune zvimwe zvikumbiro (chaizvoizvo, ingori basa. )

    Maitiro ekunyora mitemo yeCheckmarx pasina kupengaKusarudza rudzi rwekutonga paunenge uchigadzira

  5. Iwe unogona kugadzira mitemo mitsva kana kuwedzera / kunyora zvakare iripo. Kuti unyore zvakare mutemo, unofanirwa kuuwana mumuti, penya-kurudyi uye sarudza "Override" kubva pane yekudonha-pasi menyu. Zvakakosha kuyeuka pano kuti mitemo mitsva haina kutanga yakabatanidzwa mune zvakagadzirirwa uye haisi kushanda. Kuti utange kuashandisa, unofanirwa kuamisa mu "Preset Manager" menyu mune chiridzwa. Mitemo yakanyorwa patsva inochengetedza marongero avo, ndiko kuti, kana mutemo waive uchishanda, ucharamba wakadaro uye uchashandiswa nekukurumidza.

    Maitiro ekunyora mitemo yeCheckmarx pasina kupengaMuenzaniso wemutemo mutsva muPreset Manager interface

  6. Panguva yekuurayiwa, "muti" wezvikumbiro unovakwa, izvo zvinoenderana nei. Mitemo inounganidza ruzivo inotanga kuurayiwa, uye avo vanoishandisa kechipiri. Mhedzisiro yekuuraya yakavharwa, saka kana zvichikwanisika kushandisa mhedzisiro yemutemo uripo, zvino zviri nani kuita kudaro, izvi zvinoderedza nguva yekuongorora.

  7. Mitemo inogona kushandiswa pamatanho akasiyana:

  • Kune iyo yese system - ichashandiswa kune chero scanning yechero chirongwa

  • Padanho rechikwata (Timu) - inongoshandiswa kuongorora mapurojekiti muchikwata chakasarudzwa.

  • Padanho reprojekiti - Ichashandiswa mune chaiyo purojekiti

    Maitiro ekunyora mitemo yeCheckmarx pasina kupengaKusarudza nhanho iyo mutemo uchashandiswa

"Dictionary" yevanotanga

Uye ini ndichatanga nezvinhu zvishoma zvakandikonzera mibvunzo, uye ini ndicharatidzawo akati wandei maitiro anozorerutsa zvakanyanya hupenyu.

Kushanda nemazita

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

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

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

Zvese zvakawanikwa zvinhu

Mukati memutauro wakaongororwa, unogona kuwana runyoro rwezvese zvinhu zvakaonekwa naCheckmarx (tambo, mabasa, makirasi, nzira, nezvimwe). Iyi ndiyo imwe nzvimbo yezvinhu zvinogona kuwanikwa kuburikidza All. Kureva kutsvaga chinhu chine zita chairo searchMe, unogona kutsvaga, semuenzaniso, nemazita pane zvese zvakawanikwa zvinhu:

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

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

Asi, kana iwe uchida kutsvaga mune mumwe mutauro uyo nekuda kwechimwe chikonzero hauna kuverengerwa mu scan (semuenzaniso, groovy muchirongwa cheAroid), unogona kuwedzera nzvimbo yedu yechinhu kuburikidza nekusiyana:

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

Mabasa ekuyerera kwekuyerera

Aya mabasa anoshandiswa mumitemo yakawanda uye heino diki pepa pepa rezvavanoreva:

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

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

Kuwana zita refaira/nzira

Pane hunhu hwakati wandei hunogona kuwanikwa kubva pane zvabuda mubvunzo (zita refaira rakawanikwa mukati, tambo, nezvimwewo), asi magwaro haatauri mawaniro nekuashandisa. Saka, kuti uite izvi, unofanirwa kuwana iyo LinePragma chivakwa uye zvinhu zvatinoda zvichave zviri mukati mayo:

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

Zvakakodzera kuyeuka izvozvo FileName ine chaizvo nzira yefaira, sezvo isu takashandisa nzira GetFirstGraph.

Execution result

Pane yakakosha shanduko mukati meCxQL result, iyo inodzosera mugumisiro wekuita mutemo wako wakanyorwa. Iyo inotangwa nekukasira uye iwe unogona kunyora epakati mhedzisiro mairi, uchichinja uye nekunatsa iwo paunenge uchishanda. Asi, kana pasina kugoverwa kune iyi shanduko kana basa mukati memutemo return- mhedzisiro yekuuraya inogara iri zero.

Mubvunzo unotevera haudzosere chero chinhu kwatiri nekuda kwekuurayiwa uye unogara usina chinhu:

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

Asi, tapa mhedzisiro yekuuraya kune mashiripiti akasiyana mhedzisiro, isu tichaona iyo iyi kufona inodzokera kwatiri:

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

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

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

Kushandisa migumisiro yemamwe mitemo

Mitemo muCheckmarx inogona kunzi inofananidzira kumabasa mumutauro wenguva dzose wekuronga. Paunenge uchinyora mutemo, unogona kushandisa zvawanikwa zvemimwe mibvunzo. Semuenzaniso, hapana chikonzero chekutsvaga nzira dzese dzekufona mukodhi nguva dzese, ingofonera mutemo waunoda:

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

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

Iyi nzira inokubvumira kupfupisa kodeti uye kuderedza zvakanyanya nguva yekuita mutemo.

Kugadziriswa kwematambudziko

Kutema miti

Paunenge uchishanda nechishandiso, dzimwe nguva hazvibviri kunyora pakarepo mubvunzo waunoda uye unofanira kuedza, kuedza nzira dzakasiyana. Muchiitiko chakadaro, chishandiso chinopa matanda, ayo anonzi seanotevera:

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

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

Asi zvakakosha kuyeuka kuti nzira iyi inongogamuchira sekupinza tambo, saka hazvizogone kuratidza runyoro rwakakwana rwezvinhu zvakawanikwa semugumisiro wekushanda kwekutanga. Yechipiri sarudzo, iyo inoshandiswa kugadzirisa, ndeyekugovera kune mashiripiti akasiyana nguva nenguva result mhedzisiro yemubvunzo uye ona zvinoitika. Iyi nzira haina kunyatso kurongeka; iwe unofanirwa kuve nechokwadi chekuti hapana anodarika kana mashandiro neiyi mukodhi mushure. result kana kungotaura kodhi iri pazasi. Kana kuti iwe unogona, seni, kukanganwa kubvisa akati wandei mafoni akadaro kubva kune yakagadzirira-yakagadzirwa mutemo uye unoshamisika kuti nei pasina chinoshanda.

Imwe nzira iri nyore ndeyekudaidza iyo nzira return ine parameter inodiwa. Muchiitiko ichi, kuitwa kwemutemo kunopera uye tichakwanisa kuona zvakaitika semugumisiro wezvatakanyora:

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

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

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

Dambudziko rekupinda

Pane mamiriro ezvinhu apo iwe haugone kuwana CxAudit chishandiso (chinoshandiswa kunyora mitemo). Panogona kuve nezvikonzero zvakawanda zveizvi, zvinosanganisira kubondera, kamwe kamwe Windows inogadziridza, BSOD uye mamwe mamiriro ezvinhu asingatarisirwe ayo atisingakwanisi kudzora. Muchiitiko ichi, dzimwe nguva pane musangano usina kupera mudhatabhesi, izvo zvinokutadzisa kupinda mukati zvakare. Kuti ugadzirise, unofanirwa kumhanyisa mibvunzo yakawanda:

YeCheckmarx pamberi pa8.6:

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

YeCheckmarx mushure me8.6:

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

Mitemo yekunyora

Iye zvino tinosvika kune chikamu chinonyanya kufadza. Paunotanga kunyora mitemo muCxQL, izvo zvaunowanzo shaya hazvisi zvinyorwa zvakanyanya semimwe mienzaniso mhenyu yekugadzirisa mamwe matambudziko uye kutsanangura maitiro ekuti mibvunzo inoshanda sei zvachose.

Ini ndichaedza kuita kuti hupenyu huve nyore kune avo vari kutanga kunyura mumutauro wekubvunza uye kupa mienzaniso yakati wandei yekushandisa Custom Queries kugadzirisa mamwe matambudziko. Mamwe acho akajairwa uye anogona kushandiswa mukambani yako zvisina shanduko, mamwe akanyanya kujeka, asi anogona zvakare kushandiswa nekuchinja kodhi kuti ienderane nezvakatsanangurwa zvekushandisa kwako.

Saka, heano matambudziko atinosangana nawo kazhinji:

Basa: Kune akati wandei Kuyerera mumhedzisiro yekuita mutemo uye imwe yacho idendere reimwe, iwe unofanirwa kusiya imwe yacho.

mhinduro: Chokwadi, dzimwe nguva Checkmarx inoratidza akati wandei data inoyerera iyo inogona kupindirana uye kuve yakapfupikiswa vhezheni yevamwe. Pane nzira yakakosha yezviitiko zvakadaro ReduceFlow. Zvichienderana neparameter, ichasarudza ipfupi kana kureba Kuyerera:

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

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

Basa: Wedzera rondedzero yedata inonzwisisika iyo chishandiso chinoita

mhinduro: Checkmarx ine mitemo yakakosha, mhedzisiro yacho inoshandiswa nemimwe mibvunzo yakawanda. Nekuwedzera mamwe emitemo iyi nedata rakanangana nechishandiso chako, unogona kukurumidza kugadzirisa yako scanner mhinduro. Pazasi pane muenzaniso mutemo kuti utange:

General_privacy_violation_list

Ngatiwedzerei akati wandei anoshandiswa mukushandisa kwedu kuchengetedza ruzivo rwakadzama:

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

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

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

Basa: Wedzera rondedzero yezvakasiyana nemapassword

mhinduro: Ini ndingakurudzira nekukasira kutarisisa kune yekutanga mutemo wekutsanangura mapassword mukodhi uye kuwedzera kwairi runyoro rwemazita akasiyana anowanzoshandiswa mukambani yako.

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

Basa: Wedzera akashandiswa masisitimu ayo asingatsigirwe neCheckmarx

mhinduro: Yese mibvunzo muCheckmarx yakakamurwa nemutauro, saka unofanirwa kuwedzera mitemo yemutauro wega wega. Pazasi pane mimwe mienzaniso yemitemo yakadai.

Kana maraibhurari akashandiswa anozadzisa kana kutsiva mashandiro akajairika, anogona kuwedzerwa zviri nyore kumutemo wekutanga. Ipapo munhu wose anoishandisa achabva adzidza nezvesumo itsva. Semuenzaniso, maraibhurari ekupinda mu Android ndeye Timber uye Loggi. Mupakeji yekutanga, hapana mitemo yekuzivisa dzisiri-system mafoni, saka kana password kana chesesheni identifier ikapinda murogi, isu hatizive nezvazvo. Ngatiedzei kuwedzera tsananguro dzenzira dzakadai kumitemo yeCheckmarx.

Yedza kodhi muenzaniso inoshandisa iyo Timber raibhurari yekucheka matanda:

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

Uye heino muenzaniso wechikumbiro cheCheckmarx, icho chinokutendera kuti uwedzere tsananguro yekudaidza Timber nzira senzvimbo yekubuda yedata kubva mukushandisa:

FindAndroidOutputs

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

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

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

Uye iwe unogona zvakare kuwedzera kune mutemo wevavakidzani, asi uyu une chekuita zvakananga nekupinda mu Android:

TsvagaAndroidLog_Outputs

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

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

Zvakare, kana zvikumbiro zveAroid zvichishandisa WorkManager kune asynchronous basa, ipfungwa yakanaka kuwedzera kuzivisa Checkmarx nezve izvi nekuwedzera nzira yekuwana data kubva pabasa. getInputData:

FindAndroidRead

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

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

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

Basa: Kutsvaga data rakadzama mune plist yemapurojekiti eIOS

mhinduro: iOS inowanzoshandisa mafaira anokosha ane .plist extension kuti achengetedze zvakasiyana-siyana uye zvakakosha. Kuchengeta mapassword, tokens, makiyi uye imwe data inonzwisisika mune aya mafaera haakurudzirwe, sezvo anogona kutorwa kubva pachigadzirwa pasina matambudziko.

Plist mafaera ane maficha asiri pachena kune ziso rakashama, asi akakosha kuCheckmarx. Ngatinyorei mutemo unozotsvaga data yatinoda uye utiudze kana mapassword kana tokeni zvakataurwa pane imwe nzvimbo.

Muenzaniso wefaira rakadaro, iro rine chiratidzo chekutaurirana nebasa rekumashure:

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

Uye mutemo weCheckmarx, une akati wandei nuances anofanirwa kuverengerwa kana uchinyora:

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

Basa: Kutsvaga ruzivo muXML

mhinduro: Checkmarx ine mabasa akanyanya nyore ekushanda neXML uye kutsvaga kukosha, ma tag, hunhu uye nezvimwe. Asi, zvinosuwisa, pakave nekukanganisa muzvinyorwa nekuda kwekuti hapana kana muenzaniso mumwe chete unoshanda. Kunyangwe chokwadi chekuti chirema ichi chakabviswa mune yazvino vhezheni yezvinyorwa, chenjera kana iwe ukashandisa ekare zvinyorwa zvemagwaro.

Heino muenzaniso usiriwo kubva mugwaro:

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

Nekuda kwekuedza kwekuuraya, isu tichagamuchira kukanganisa kuti All hapana nzira yakadaro... Uye ichi ichokwadi, sezvo paine yakakosha, yakaparadzana chinhu nzvimbo yekushandisa mabasa ekushanda neXML - cxXPath. Izvi ndizvo zvinotaridzika semubvunzo chaiwo wekutsvaga marongero mu Android anobvumira kushandiswa kweHTTP traffic:

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

Ngatizvitarisei mune zvishoma zvakadzama, sezvo syntax yemabasa ese yakafanana, mushure mekunge wafunga imwe, saka unongoda kusarudza iyo yaunoda. Saka, sequentially maererano parameters:

  • "*.xml"- mask yemafaira ekutsvaga

  • 8 — id yemutauro unoshandisirwa mutemo

  • "cleartextTrafficPermitted"- zita rehunhu mu xml

  • "true" - kukosha kwechimiro ichi

  • false -Kushandisa kutaura nguva dzose paunenge uchitsvaga

  • true - zvinoreva kuti kutsvaga kuchaitwa kusaregeredza kesi, kureva, kesi-isinganzwi

Semuenzaniso, isu takashandisa mutemo unozivisa zvisirizvo, kubva pakuchengetedza kwekuona, network yekubatanidza marongero mu Android inobvumira kutaurirana neserver kuburikidza neHTTP protocol. Muenzaniso wegadziriro ine hunhu cleartextTrafficPermitted zvine zvazvinoreva 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>

Basa: Deredza mibairo nezita/gwara refaira

mhinduro: Mune imwe yemapurojekiti mahombe ane chekuita nekuvandudzwa kwenharembozha yeAndroid, takasangana nemanyepo emutemo unotemesa iyo obfuscation marongero. Ichokwadi ndechokuti mutemo kunze kwebhokisi unotsvaga mufaira build.gradle marongero ane chekuita nekushandisa mitemo yeobfuscation yeshanduro yekuburitsa yechishandiso.

Asi mumapurojekiti makuru dzimwe nguva kune mafaira emwana build.gradle, izvo zvinoreva maraibhurari anosanganisirwa muchirongwa. Iyo peculiarity ndeyekuti kunyangwe mafaera aya asingaratidze kudikanwa kwekubfuscation, marongero efaira regungano revabereki anozoshandiswa panguva yekuunganidza.

Nekudaro, basa nderekucheka zvinokonzeresa mumafaira evana ari emaraibhurari. Vanogona kuzivikanwa nekuvapo kwemutsara apply 'com.android.library'.

Muenzaniso kodhi kubva kufaira build.gradle, iyo inosarudza kudiwa kwekubfuscation:

apply plugin: 'com.android.application'

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

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

dependencies {
  ...
}

Muenzaniso faira build.gradle yeraibhurari inosanganisirwa mupurojekiti isina iyi marongero:

apply plugin: 'android-library'

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

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

Uye mutemo weCheckmarx:

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

Iyi nzira inogona kuve yepasirese uye inobatsira kwete chete kune Android zvikumbiro, asiwo kune dzimwe nyaya kana iwe uchifanira kuona kana mhedzisiro iri yeimwe faira.

Basa: Wedzera rutsigiro rwechitatu bato raibhurari kana iyo syntax isina kutsigirwa zvizere

mhinduro: Huwandu hweakasiyana masisitimu anoshandiswa mukuita kwekunyora kodhi angori kunze kwemachati. Ehe, Checkmarx haigaroziva nezve kuvapo kwavo, uye basa redu nderekuidzidzisa kuti inzwisise kuti dzimwe nzira ndedzeiyo chimiro. Dzimwe nguva izvi zvinoomeswa nenyaya yekuti masisitimu anoshandisa mazita emabasa akajairika uye hazvigoneke kunyatsoona hukama hweimwe runhare kune chaiyo raibhurari.

Chinonetsa ndechekuti syntax yemaraibhurari akadaro haiwanzo zivikanwa nenzira kwayo uye unofanirwa kuyedza kudzivirira kuwana huwandu hukuru hwenhema. Pane akati wandei sarudzo dzekuvandudza kurongeka kwekuongorora uye kugadzirisa dambudziko:

  • Sarudzo yekutanga, tinoziva kuti raibhurari inoshandiswa mune imwe purojekiti uye inogona kushandisa mutemo padanho rechikwata. Asi kana timu ikafunga kutora imwe nzira kana kushandisa maraibhurari akati wandei umo mazita emabasa anopindirana, tinogona kuwana mufananidzo usinganakidze wezvakawanda zvenhema.

  • Chechipiri sarudzo ndeyekutsvaga mafaira umo raibhurari inotengeswa kunze kwenyika zvakajeka. Neiyi nzira, tinogona kuve nechokwadi chekuti raibhurari yatinoda inoshandiswa chaizvo mufaira iri.

  • Uye yechitatu sarudzo ndeye kushandisa nzira mbiri dziri pamusoro pamwe chete.

Semuenzaniso, ngatitarisei raibhurari inozivikanwa kwazvo mumatenderedzwa matete spy yemutauro weScala programming, kureva, kushanda Kupesanisa Zvinhu Zvinokosha. Kazhinji, kupfuudza ma parameter kumubvunzo weSQL, unofanirwa kushandisa mushandisi $, iyo inotsiva data mune yakafanorongwa SQL query. Iko ndiko, kutaura zvazviri, iyo yakananga analogue ye Prepared Statement muJava. Asi, kana iwe uchida kugadzira zvine simba SQL query, semuenzaniso, kana iwe uchida kupfuudza mazita ematafura, unogona kushandisa opareta. #$, iyo ichatsiva zvakananga data mumubvunzo (inenge senge tambo concatenation).

Sample code:

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

Checkmarx haisati yaziva maitiro ekuona mashandisirwo eSplicing Literal Values ​​uye skips vanoshanda. #$, saka ngatiedzei kuidzidzisa kuti ione angangoita majekiseni eSQL uye kuratidza nzvimbo dzakakodzera mukodhi:

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

Basa: Tsvaga akashandiswa ari munjodzi mumaraibhurari eOpen-Source

mhinduro: Makambani mazhinji anoshandisa Open-Source yekutarisa maturusi (OSA tsika) kuona kushandiswa kweshanduro dzisina njodzi dzemaraibhurari mumashandisirwo akagadzirwa. Dzimwe nguva hazvibviri kuvandudza raibhurari yakadaro kune shanduro yakachengeteka. Mune zvimwe zviitiko kune zvisingakwanisi kushanda, mune zvimwe hapana shanduro yakachengeteka zvachose. Muchiitiko ichi, kusanganiswa kweSAST uye OSA maitiro achabatsira kuona kuti mabasa anotungamirira kushandiswa kwekusagadzikana haashandiswi mukodhi.

Asi dzimwe nguva, kunyanya kana uchifunga nezveJavaScript, iri rinogona kunge risiri basa diki zvachose. Pazasi pane mhinduro, pamwe isina kunaka, asi zvakadaro inoshanda, uchishandisa muenzaniso wehutera muchikamu. lodash munzira template и *set.

Mienzaniso yebvunzo ingangoita njodzi kodhi muJS faira:

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

Uye kana uchibatanidza zvakananga 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>

Tiri kutsvaga nzira dzedu dzese dzisina njodzi, dzakanyorwa mukusagadzikana:

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

Basa: Kutsvaga zvitupa zvakaiswa muapp

mhinduro: Hazvisi zvisizvo kune zvikumbiro, kunyanya nharembozha, kushandisa zvitupa kana makiyi kuwana akasiyana maseva kana kuona SSL-Pinning. Kubva pakuona kwekuchengetedza, kuchengetedza zvinhu zvakadaro mukodhi haisi iyo nzira yakanakisisa. Ngatiedzei kunyora mutemo unozotsvaga mafaera akafanana mune repository:

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

Basa: Kutsvaga ma tokeni akakanganiswa mukushandisa

mhinduro: Zvinowanzodikanwa kubvisa zviratidzo zvakakanganiswa kana mamwe mashoko anokosha aripo mukodhi. Ehe, kuvachengeta mukati meiyo kodhi kodhi haisi zano rakanaka, asi mamiriro anosiyana. Nekuda kweCxQL mibvunzo, kuwana zvinhu zvakaita seizvi zviri nyore:

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

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

mhedziso

Ndinovimba kuti chinyorwa ichi chichabatsira kune avo vari kutanga kuzivana kwavo neCheckmarx chishandiso. Zvichida avo vave vachinyora mitemo yavo kwenguva yakareba vachawanawo chimwe chinhu chinobatsira mugwaro iri.

Nehurombo, parizvino pane kushomeka kwesosi uko mazano matsva anogona kuunganidzwa panguva yekuvandudzwa kwemitemo yeCheckmarx. Ndiko kusaka takagadzira repository paGithub, kwatichatumira basa redu kuitira kuti munhu wose anoshandisa CxQL awane chimwe chinhu chinobatsira mairi, uyewo ave nemukana wekugoverana basa ravo nenharaunda. Iyo repository iri munzira yekuzadza uye kugadzira zvemukati, saka vanopa vanogamuchirwa!

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

Source: www.habr.com

Voeg