Mokhoa oa ho ngola melao ea Checkmarx ntle le ho hlanya

Hey Habr!

Mosebetsing oa rona, k'hamphani ea rona hangata e sebetsana le lisebelisoa tse fapaneng tsa tlhahlobo ea khoutu e tsitsitseng (SAST). Ka ntle ho lebokose kaofela ba sebetsa ka karolelano. Ha e le hantle, tsohle li itšetlehile ka morero le theknoloji e sebelisoang ho eona, hammoho le hore na mekhoa ena ea theknoloji e koahetsoe joang ke melao ea tlhahlobo. Ka maikutlo a ka, e 'ngoe ea lintlha tsa bohlokoa ka ho fetisisa ha u khetha sesebelisoa sa SAST ke bokhoni ba ho se etsa ka mokhoa o ikhethileng oa likopo tsa hau, e leng, ho ngola le ho fetola melaoana ea tlhahlobo kapa, joalo ka ha e bitsoa hangata, Custom Queries.

Mokhoa oa ho ngola melao ea Checkmarx ntle le ho hlanya

Hangata re sebelisa Checkmarx - sehlahlobi sa khoutu se khahlang haholo ebile se matla. Sehloohong sena ke tla bua ka phihlelo ea ka ea ho ngola melao ea tlhahlobo bakeng sa eona.

Lethathamo la tse kahare

ho kena

Ho qala, ke kopa ho khothaletsa e 'ngoe ea lingoliloeng tse' maloa ka Serussia mabapi le likarolo tsa lipotso tsa ho ngola bakeng sa Checkmarx. E phatlalalitsoe ho Habré qetellong ea 2019 tlasa sehlooho se reng: "Dumela, Checkmarx!" Mokhoa oa ho ngola potso ea Checkmarx SAST le ho fumana bofokoli bo botle.

E hlahloba ka ho qaqileng mokhoa oa ho ngola lipotso tsa pele ho CxQL (Checkmarx Query Language) bakeng sa ts'ebeliso e itseng ea teko le ho bontša melao-motheo ea hore na melao ea tlhahlobo e sebetsa joang.

Ha ke na ho pheta se hlalosoang ho eona, le hoja mateano a litsela a ntse a tla ba teng. Sehloohong sa ka ke tla leka ho bokella mofuta oa "pokello ea diresepe", lethathamo la tharollo ea mathata a itseng ao ke ileng ka kopana le 'ona nakong ea mosebetsi oa ka le Checkmarx. Ke ile ka tlameha ho qhekella likelello tsa ka ka a mangata a mathata ana. Ka linako tse ling ho ne ho se na boitsebiso bo lekaneng litokomaneng, ’me ka linako tse ling ho ne ho bile ho le thata ho utloisisa mokhoa oa ho etsa se hlokahalang. Ke tšepa hore phihlelo ea ka le masiu a ho hloka boroko e ke ke ea e-ba lefeela, 'me "pokello ena ea Custom Queries recipes" e tla u bolokela lihora tse' maloa kapa lisele tse 'maloa tsa methapo. Kahoo, a re qaleng!

Lintlha tse akaretsang mabapi le melao

Pele, a re shebeng likhopolo tse seng kae tsa motheo le mokhoa oa ho sebetsa le melao, bakeng sa kutloisiso e molemo ea se tla etsahala ka mor'a moo. Hape hape hobane litokomane ha li bue letho ka sena kapa li hasane haholo ka mohahong, o seng bonolo haholo.

  1. Melao e sebelisoa nakong ea ho skena ho ipapisitsoe le setaele se khethiloeng qalong (sete sa melao e sebetsang). U ka etsa palo e sa lekanyetsoang ea li-presets, 'me hantle hore na u ka li hlophisa joang ho ipapisitse le lintlha tsa ts'ebetso ea hau. U ka li arola ka puo kapa ua khetha litlhophiso tsa projeke ka 'ngoe. Palo ea melao e sebetsang e ama lebelo le ho nepahala ha scanning.

    Mokhoa oa ho ngola melao ea Checkmarx ntle le ho hlanyaHo theha Preset ka sebopeho sa Checkmarx

  2. Melao e hlophisitsoe ka sesebelisoa se khethehileng se bitsoang CxAuditor. Ena ke sesebelisoa sa komporo se hokelang ho seva e sebelisang Checkmarx. Sesebelisoa sena se na le mekhoa e 'meli ea ts'ebetso: melao ea ho hlophisa le ho sekaseka sephetho sa scan ninete e seng e entsoe.

    Mokhoa oa ho ngola melao ea Checkmarx ntle le ho hlanyaCxAudit interface

  3. Melao ea Checkmarx e arotsoe ka puo, ke hore, puo ka 'ngoe e na le lipotso tsa eona. Ho boetse ho na le melaoana e akaretsang e sebetsang ho sa natsoe puo, tsena ke tse bitsoang lipotso tsa mantlha. Hangata, lipotso tsa mantlha li kenyelletsa ho batla tlhahisoleseling eo melao e meng e e sebelisang.

    Mokhoa oa ho ngola melao ea Checkmarx ntle le ho hlanyaHo arola melao ka puo

  4. Melao ke "E ka Phethahatsoang" le "E sa Phethahaleng" (E phethiloe ebile ha e Phelisoe). Ha se lebitso le nepahetseng, ka maikutlo a ka, empa ke seo e leng sona. Ntlha ea bohlokoa ke hore sephetho sa ho phethahatsa melao ea "Executable" se tla hlahisoa liphethong tsa scan ho UI, 'me melao ea "Non-Executable" e hlokahala feela ho sebelisa liphetho tsa bona ho likopo tse ling (ha e le hantle, ke mosebetsi feela).

    Mokhoa oa ho ngola melao ea Checkmarx ntle le ho hlanyaHo khetha mofuta oa molao ha o theha

  5. O ka theha melao e mecha kapa ho tlatselletsa/ho ngola hape e teng. E le hore u ngole molao hape, u lokela ho o fumana sefateng, tobetsa ka ho le letona ebe u khetha "Override" ho tswa ho menu e theoha. Ke habohlokoa ho hopola mona hore melao e mecha ha e kenyelletsoe qalong ho li-presets mme ha e sebetse. Ho qala ho li sebelisa o hloka ho li kenya tšebetsong ho "Preset Manager" ho sesebelisoa. Melao e ngotsoeng bocha e boloka litlhophiso tsa bona, ke hore, haeba molao o ne o sebetsa, o tla lula o le joalo mme o tla sebelisoa hang-hang.

    Mokhoa oa ho ngola melao ea Checkmarx ntle le ho hlanyaMohlala oa molao o mocha ho Preset Manager interface

  6. Nakong ea ho bolaoa, ho hahoa "sefate" sa likopo, se itšetlehileng ka eng. Melao e bokellang tlhahisoleseding e phethisoa pele, le ba e sebelisang lekhetlo la bobeli. Sephetho sa ho bolaoa ke cache, kahoo haeba ho khoneha ho sebelisa liphello tsa molao o teng, joale ho molemo ho etsa joalo, sena se tla fokotsa nako ea ho hlahloba.

  7. Melao e ka sebelisoa maemong a fapaneng:

  • Bakeng sa sistimi eohle - e tla sebelisoa bakeng sa tlhahlobo efe kapa efe ea projeke efe kapa efe

  • Boemong ba sehlopha (Sehlopha) - se tla sebelisoa feela ho hlahloba merero sehlopheng se khethiloeng.

  • Boemong ba morero - E tla sebelisoa morerong o itseng

    Mokhoa oa ho ngola melao ea Checkmarx ntle le ho hlanyaHo khetha boemo boo molao o tla sebelisoa ho bona

"Dictionary" bakeng sa ba qalang

'Me ke tla qala ka lintho tse' maloa tse ileng tsa mpakela lipotso, hape ke tla bontša mekhoa e mengata e tla nolofatsa bophelo haholo.

Ts'ebetso e nang le manane

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

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

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

Lintlha tsohle tse fumanehang

Ka har'a puo e hlahlobiloeng, u ka fumana lethathamo la likarolo tsohle tseo Checkmarx e li khethileng (likhoele, mesebetsi, lihlopha, mekhoa, joalo-joalo). Ena ke sebaka se seng sa lintho tse ka fihlellehang ka All. Ke ho batla ntho e nang le lebitso le itseng searchMe, o ka batla, mohlala, ka mabitso ho lintho tsohle tse fumanoeng:

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

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

Empa, haeba o hloka ho batla ka puo e 'ngoe eo ka mabaka a mang e sa kang ea kenyelletsoa ho scan (mohlala, groovy morerong oa Android), o ka holisa sebaka sa rona sa ntho ka ho feto-fetoha:

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

Mesebetsi ea tlhahlobo ea Phallo

Mesebetsi ena e sebelisoa melaong e mengata mme mona ke leqephe le lenyenyane la ho qhekella la seo ba se bolelang:

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

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

Ho fumana lebitso la faele / tsela

Ho na le litšoaneleho tse 'maloa tse ka fumanoang liphethong tsa potso (lebitso la faele eo ho kenoang ho eona, khoele, joalo-joalo), empa litokomane ha li bolele mokhoa oa ho li fumana le ho li sebelisa. Kahoo, ho etsa sena, o hloka ho fihlella thepa ea LinePragma mme lintho tseo re li hlokang li tla be li le ka hare ho eona:

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

Ke habohlokoa ho hopola seo FileName e na le tsela ea faele, kaha re sebelisitse mokhoa ona GetFirstGraph.

Sephetho sa ho phethahatsa

Ho na le phapang e khethehileng ka hare ho CxQL result, e khutlisetsang sephetho sa ho phethahatsa molao oa hau o ngotsoeng. E qalisoa hang-hang 'me u ka ngola liphetho tsa lipakeng ho eona, u li fetola le ho li hloekisa ha u ntse u sebetsa. Empa, haeba ho se na kabelo ho feto-fetoha kapa mosebetsi ona ka hare ho molao return- sephetho sa ts'ebetso se tla lula se le zero.

Potso e latelang e ke ke ea khutlisa letho ho rona ka lebaka la ho bolaoa 'me e tla lula e se na letho:

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

Empa, ha re fane ka sephetho sa ts'ebetso sephethong sa boselamose, re tla bona hore na mohala ona o re khutlisetsa ho rona:

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

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

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

Ho sebelisa liphetho tsa melaoana e meng

Melao ho Checkmarx e ka bitsoa e ts'oanang le mesebetsi ka puo e tloaelehileng ea lenaneo. Ha u ngola molao, u ka sebelisa liphetho tsa lipotso tse ling. Mohlala, ha ho na tlhoko ea ho batla mehala eohle ka khoutu nako le nako, letsetsa feela molao o lakatsehang:

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

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

Mokhoa ona o u lumella ho khutsufatsa khoutu le ho fokotsa haholo nako ea ts'ebetso ea molao.

Tharollo ea mathata

Ho rema lifate

Ha u sebetsa le sesebelisoa, ka linako tse ling ho ke ke ha khoneha ho ngola potso e lakatsehang hang-hang 'me u tlameha ho leka, ho leka likhetho tse fapaneng. Bakeng sa boemo bo joalo, sesebelisoa se fana ka ho rema lifate, se bitsoang ka tsela e latelang:

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

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

Empa ke habohlokoa ho hopola hore mokhoa ona o amohela feela e le ho kenya letsoho khoele, kahoo ho ke ke ha khoneha ho hlahisa lenane le feletseng la likarolo tse fumanoeng ka lebaka la ts'ebetso ea pele. Khetho ea bobeli, e sebelisetsoang ho lokisa liphoso, ke ho fana ka phetoho ea boselamose nako le nako result sephetho sa potso mme o bone se etsahalang. Mokhoa ona ha o bonolo haholo; o hloka ho etsa bonnete ba hore ha ho na litlamorao kapa ts'ebetso ka sena khoutu kamora result kapa feela fana ka maikutlo khoutu e ka tlase. Kapa, ​​​​joaloka 'na, u ka lebala ho tlosa mehala e' maloa e joalo molaong o lokiselitsoeng 'me u ipotse hore na ke hobane'ng ha ho se letho le sebetsang.

Mokhoa o bonolo haholoanyane ke ho letsetsa mokhoa return ka parameter e hlokahalang. Tabeng ena, ho phethahatsa molao ho tla fela 'me re tla khona ho bona se etsahetseng ka lebaka la seo re se ngotseng:

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

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

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

Bothata ba ho kena

Ho na le maemo ao u sa khoneng ho fihlella sesebelisoa sa CxAudit (se sebelisetsoang ho ngola melao). Ho ka ba le mabaka a mangata a sena, ho kenyelletsa likotsi, liapdeite tsa Windows tsa tšohanyetso, BSOD le maemo a mang a sa lebelloang ao re ke keng ra a laola. Tabeng ena, ka linako tse ling ho na le seboka se sa phethoang ka har'a database, se u thibelang ho kena hape. Ho e lokisa, o hloka ho botsa lipotso tse 'maloa:

Bakeng sa Checkmarx pele ho 8.6:

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

Bakeng sa Checkmarx kamora 8.6:

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

Melao ea ho ngola

Hona joale re fihla karolong e thahasellisang ka ho fetisisa. Ha o qala ho ngola melao ho CxQL, seo hangata o se hlokang ha se litokomane tse ngata joalo ka mehlala e meng e phelang ea ho rarolla mathata a itseng le ho hlalosa mokhoa oa hore na lipotso li sebetsa joang ka kakaretso.

Ke tla leka ho nolofatsa bophelo ho ba seng ba qala ho ikakhela ka setotsoana puong ea lipotso le ho fana ka mehlala e mengata ea ho sebelisa Custom Queries ho rarolla mathata a itseng. Tse ling tsa tsona li atile haholo 'me li ka sebelisoa k'hamphaning ea hau ntle le liphetoho, tse ling li totobetse haholoanyane, empa li ka sebelisoa ka ho fetola khoutu hore e lumellane le litlhoko tsa lits'ebetso tsa hau.

Kahoo, ana ke mathata ao re kopanang le ona hangata:

Mosebetsi: Ho na le Liphallo tse 'maloa liphellong tsa ho phethahatsa molao' me e 'ngoe ea tsona ke sehlaha sa e' ngoe, u tlameha ho tlohela e 'ngoe ea tsona.

tharollo: Ehlile, ka linako tse ling Checkmarx e bonts'a phallo ea data e 'maloa e ka qollang le ho ba mofuta o khuts'oane oa ba bang. Ho na le mokhoa o khethehileng bakeng sa linyeoe tse joalo ReduceFlow. Ho ipapisitsoe le paramethara, e tla khetha Phallo e khuts'oane kapa e telele ka ho fetesisa:

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

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

Mosebetsi: Eketsa lethathamo la lintlha tsa bohlokoa tseo sesebelisoa se sebetsanang le tsona

tharollo: Checkmarx e na le melao ea mantlha, eo liphetho tsa eona li sebelisoang ke lipotso tse ling tse ngata. Ka ho tlatselletsa e meng ea melao ena ka data e ikhethileng ts'ebelisong ea hau, o ka ntlafatsa hanghang liphetho tsa hau tsa skena. Mona ke mohlala oa molao oa ho qala:

General_privacy_violation_list

Ha re kenyelleng mefuta e mengata e sebelisoang ts'ebelisong ea rona ho boloka lintlha tsa bohlokoa:

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

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

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

Mosebetsi: Atolosa lenane la lintho tse feto-fetohang ka li-password

tharollo: Ke khothaletsa hang-hang ho ela hloko molao oa motheo oa ho hlalosa li-passwords ka khoutu le ho e kenyelletsa lethathamong la mabitso a fapaneng a sebelisoang hangata k'hamphaning ea hau.

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

Mosebetsi: Kenya liforeimi tse sebelisitsoeng tse sa tšehetsoeng ke Checkmarx

tharollo: Lipotso tsohle ho Checkmarx li arotsoe ka puo, kahoo o hloka ho eketsa melao bakeng sa puo ka 'ngoe. Ka tlaase ke mehlala e meng ea melao e joalo.

Haeba lilaebrari li sebelisoa tse tlatselletsang kapa tse fetolang tšebetso e tloaelehileng, li ka kenyelletsoa habonolo molaong oa mantlha. Joale e mong le e mong ea e sebelisang o tla ithuta hang-hang ka likenyelletso tse ncha. Ka mohlala, lilaebrari tsa ho rema lifate ho Android ke Timber le Loggi. Ka har'a sephutheloana sa mantlha, ha ho na melao ea ho khetholla mehala eo e seng ea sistimi, kahoo haeba senotlolo kapa sesupo sa nako se kena ka har'a log, re ke ke ra tseba ka eona. Ha re leke ho kenyelletsa litlhaloso tsa mekhoa e joalo ho melao ea Checkmarx.

Mohlala oa khoutu ea teko o sebelisang laeborari ea Timber bakeng sa ho rema lifate:

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

Mona ke mohlala oa kopo ea Checkmarx, e tla u lumella ho eketsa tlhaloso ea ho bitsa mekhoa ea Timber e le sebaka sa ho tsoa bakeng sa data ho tsoa ts'ebelisong:

FumanaAndroidOutputs

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

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

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

Hape o ka eketsa molao oa boahelani, empa ona o amana ka kotloloho le ho rema lifate ho Android:

FumanaAndroidLog_Outputs

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

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

Hape, haeba lisebelisoa tsa Android li sebelisa Motsamaisi oa Mosebetsi bakeng sa mosebetsi o sa tsitsang, ke mohopolo o motle ho tsebisa Checkmarx ka sena ka ho kenyelletsa mokhoa oa ho fumana data ho tsoa mosebetsing. getInputData:

FumanaAndroidRead

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

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

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

Mosebetsi: E batla lintlha tsa bohlokoa ka har'a plist bakeng sa merero ea iOS

tharollo: Hangata iOS e sebelisa lifaele tse khethehileng tse nang le katoloso ea .plist ho boloka mefuta e fapaneng le boleng. Ho boloka li-password, li-tokens, linotlolo le lintlha tse ling tsa bohlokoa ho lifaele tsena ha ho khothalletsoe, kaha li ka ntšoa sesebelisoa ntle le mathata.

Lifaele tsa Plist li na le likarolo tse sa bonahaleng ka mahlo, empa li bohlokoa ho Checkmarx. Ha re ngole molao o tla batla lintlha tseo re li hlokang mme o re bolelle hore na li-password kapa li-tokens li boleloa kae-kae.

Mohlala oa faele e joalo, e nang le lets'oao la puisano le tšebeletso ea morao-rao:

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

Le molao oa Checkmarx, o nang le lintlha tse 'maloa tse lokelang ho tsotelloa ha o ngola:

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

Mosebetsi: Fumana lintlha ho XML

tharollo: Checkmarx e na le mesebetsi e bonolo haholo ea ho sebetsa le XML le ho batla boleng, li-tag, litšoaneleho le tse ling. Empa, ka bomalimabe, ho bile le phoso litokomaneng ka lebaka leo ho seng mohlala o le mong o sebetsang. Ho sa tsotellehe taba ea hore sekoli sena se felisitsoe phetolelong ea morao-rao ea litokomane, ela hloko haeba u sebelisa liphetolelo tsa pejana tsa litokomane.

Mohlala o fosahetseng ho tsoa litokomaneng ke ona:

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

Ka lebaka la teko ea ho phethahatsa, re tla fumana phoso ea hore All Ha ho na mokhoa o joalo ... 'Me sena ke' nete, kaha ho na le sebaka se khethehileng, se arohaneng sa ho sebelisa mesebetsi bakeng sa ho sebetsa le XML - cxXPath. Sena ke seo potso e nepahetseng e shebahalang ka sona ho fumana maemo ho Android a lumellang ts'ebeliso ea sephethephethe sa HTTP:

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

Ha re e shebe ka botlalo, kaha syntax ea mesebetsi eohle e tšoana, ka mor'a hore u fumane e le 'ngoe, u tlameha feela ho khetha eo u e hlokang. Kahoo, ka sequentially ho ea ka parameters:

  • "*.xml"- mask a lifaele tse lokelang ho batloa

  • 8 — id ya puo eo molao o sebediswang ho yona

  • "cleartextTrafficPermitted"- lebitso la semelo ho xml

  • "true" - boleng ba tšobotsi ena

  • false - tshebediso ya polelo e tlwaelehileng ha o batla

  • true - ho bolela hore patlisiso e tla etsoa ho hlokomoloha nyeoe, ke hore, ha e na taba

Mohlala, re sebelisitse molao o supang hore o fosahetse, ho latela pono ea ts'ireletso, litlhophiso tsa khokahano ea marang-rang ho Android e lumellang puisano le seva ka protocol ea HTTP. Mohlala oa maemo a nang le tšobotsi cleartextTrafficPermitted e nang le moelelo 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>

Mosebetsi: Fokotsa liphetho ka lebitso la faele / tsela

tharollo: Ho e 'ngoe ea merero e meholo e amanang le nts'etsopele ea sesebelisoa sa mohala sa Android, re ile ra kopana le lintlha tse fosahetseng tsa molao o khethollang maemo a obfuscation. 'Nete ke hore molao o kantle ho lebokose o batla faeleng build.gradle boemo bo ikarabellang bakeng sa ho sebelisa melao ea obfuscation bakeng sa tokollo ea ts'ebeliso.

Empa mererong e meholo ka linako tse ling ho na le lifaele tsa bana build.gradle, tse buang ka lilaebrari tse kenyellelitsoeng morerong ona. Ntho e ikhethang ke hore le haeba lifaele tsena li sa bontše tlhokahalo ea ho hlaka, litlhophiso tsa faele ea kopano ea motsoali li tla sebelisoa nakong ea ho bokella.

Kahoo, mosebetsi ke ho khaola li-triggers lifaeleng tsa bana tseo e leng tsa lilaeborari. Li ka tsejoa ka ho ba teng ha mola apply 'com.android.library'.

Mohlala oa khoutu ho tsoa faeleng build.gradle, e khethollang tlhoko ea obfuscation:

apply plugin: 'com.android.application'

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

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

dependencies {
  ...
}

Mohlala oa faele build.gradle bakeng sa laeborari e kenyellelitsoeng morerong e se nang maemo ana:

apply plugin: 'android-library'

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

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

Le molao oa 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);
		}
	}
}

Mokhoa ona o ka ba oa bokahohleng mme oa thusa eseng feela lits'ebetsong tsa Android, empa hape le maemong a mang ha o hloka ho tseba hore na sephetho ke sa faele e itseng.

Mosebetsi: Kenya tšehetso bakeng sa laebrari ea batho ba bang haeba syntax e sa tšehetsoe ka botlalo

tharollo: Palo ea meralo e fapaneng e sebelisoang nakong ea ho ngola khoutu e kantle ho lichate. Ehlile, Checkmarx ha se kamehla e tsebang ka boteng ba bona, mme mosebetsi oa rona ke ho e ruta ho utloisisa hore mekhoa e itseng ke ea moralo ona. Ka linako tse ling sena se thatafatsoa ke taba ea hore li-frameworks li sebelisa mabitso a ts'ebetso a tloaelehileng haholo 'me ho ke ke ha khoneha ho tseba ka mokhoa o hlakileng kamano ea pitso e itseng ho laeborari e itseng.

Bothata ke hore syntax ea lilaebrari tse joalo ha e amoheloe ka nepo mme o tlameha ho etsa liteko ho qoba ho fumana lintlha tse ngata tse fosahetseng. Ho na le likhetho tse 'maloa tsa ho ntlafatsa ho nepahala ha skena le ho rarolla bothata:

  • Khetho ea pele, re tseba hantle hore laeborari e sebelisoa morerong o itseng mme e ka sebelisa molao boemong ba sehlopha. Empa haeba sehlopha se nka qeto ea ho nka mokhoa o fapaneng kapa se sebelisa lilaeborari tse 'maloa moo mabitso a ts'ebetso a kopanang, re ka fumana setšoantšo se sa thabiseng sa lintlha tse ngata tse fosahetseng.

  • Khetho ea bobeli ke ho batla lifaele tseo ho tsona laebrari e tsoang kantle ho naha. Ka mokhoa ona, re ka ba le bonnete ba hore laebrari eo re e hlokang e sebelisoa hantle faeleng ena.

  • 'Me khetho ea boraro ke ho sebelisa mekhoa e' meli e ka holimo hammoho.

Ka mohlala, a re shebeng laebrari e tsebahalang ka har'a mekhahlelo e moqotetsane siling bakeng sa puo ea lenaneo la Scala, e leng, tshebetso Ho Arohakanya Maemo a Sebele. Ka kakaretso, ho fetisetsa litlhophiso ho potso ea SQL, o tlameha ho sebelisa opareitara $, e kenyang data sebakeng sa potso ea SQL e hlophisitsoeng esale pele. Ke hore, ha e le hantle, ke analogue e tobileng ea Polelo e Lokisitsoeng ho Java. Empa, haeba o hloka ho theha potso ea SQL ka matla, mohlala, haeba o hloka ho fetisa mabitso a tafole, o ka sebelisa opareitara. #$, e tla kenya data sebakeng sa potso ka kotloloho (hoo e ka bang joalo ka khokahano ea likhoele).

Mohlala oa khoutu:

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

Checkmarx ha e so tsebe ho bona ts'ebeliso ea Splicing Literal Values ​​le ho tlola li-operators. #$, kahoo a re lekeng ho e ruta ho khetholla liente tsa SQL tse ka bang teng le ho totobatsa libaka tse nepahetseng khoutu:

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

Mosebetsi: Batla lisebelisoa tse sebelisoang habonolo lilaebraring tsa Open-Source

tharollo: Likhamphani tse ngata li sebelisa lithulusi tsa Open-Source monitoring (OSA tloaelo) ho bona ts'ebeliso ea lilaebrari tse tlokotsing lits'ebetsong tse ntlafalitsoeng. Ka linako tse ling ha ho khonehe ho nchafatsa laebrari e joalo hore e be mofuta o sireletsehileng. Maemong a mang ho na le mefokolo ea ts'ebetso, ho tse ling ha ho na mofuta o sireletsehileng ho hang. Tabeng ena, motsoako oa mekhoa ea SAST le ea OSA e tla thusa ho fumana hore mesebetsi e lebisang ho sebelisoa ha ts'oaetso ha e sebelisoe khoutu.

Empa ka linako tse ling, haholo-holo ha u nahana ka JavaScript, sena e kanna ea se be mosebetsi o sa reng letho. Ka tlase ke tharollo, mohlomong ha e ntle, empa leha ho le joalo e sebetsa, e sebelisa mohlala oa bofokoli karolong. lodash ka mekhoa template и *set.

Mehlala ea liteko tse ka bang kotsi faeleng ea 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!'

Mme ha o hokela ka kotloloho ho 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>

Re batla mekhoa ea rona eohle e tlokotsing, e thathamisitsoeng ka bofokoli:

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

Mosebetsi: E batla litifikeiti tse kentsoeng ts'ebelisong

tharollo: Ho tloaelehile hore lits'ebetso, haholo-holo tse tsamaeang, li sebelise litifikeiti kapa linotlolo ho fihlella li-server tse fapaneng kapa ho netefatsa SSL-Pinning. Ho latela pono ea ts'ireletso, ho boloka lintho tse joalo ka khoutu ha se mokhoa o motle ka ho fetisisa. Ha re leke ho ngola molao o tla batla lifaele tse tšoanang sebakeng sa polokelo:

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

Mosebetsi: Ho fumana li-tokens tse sekiselitsoeng ts'ebelisong

tharollo: Hangata hoa hlokahala ho hlakola li-tokens tse sekiselitsoeng kapa lintlha tse ling tsa bohlokoa tse teng khoutu. Ehlile, ho li boloka ka har'a khoutu ea mohloli ha se mohopolo o motle, empa maemo aa fapana. Ka lebaka la lipotso tsa CxQL, ho fumana lintho tse kang tsena ho bonolo haholo:

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

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

fihlela qeto e

Ke tšepa hore sehlooho sena se tla ba molemo ho ba qalang ho tloaelana le sesebelisoa sa Checkmarx. Mohlomong ba seng ba ntse ba ngola melao ea bona ka nako e telele le bona ba tla fumana ho hong ho molemo ho tataiso ena.

Ka bomalimabe, hajoale ho na le khaello ea sesebelisoa moo mehopolo e mecha e ka fumanoang nakong ea nts'etsopele ea melao ea Checkmarx. Ke kahoo re entseng polokelo ho Github, moo re tla beha mosebetsi oa rona e le hore bohle ba sebelisang CxQL ba fumane ho hong ho molemo ho eona, hape ba be le monyetla oa ho arolelana mosebetsi oa bona le sechaba. Sebaka sa polokelo se mothating oa ho tlatsa le ho hlophisa litaba, kahoo bafani ba amohelehile!

Kea le leboha ka tlhokomelo ea hau!

Source: www.habr.com

Eketsa ka tlhaloso