Yadda ake rubuta dokoki don Checkmarx ba tare da yin hauka ba

Hai Habr!

A cikin aikinmu, kamfaninmu sau da yawa yana ma'amala da kayan aikin bincike na lamba daban-daban (SAST). Daga cikin akwatin duk suna aiki matsakaici. Tabbas, duk ya dogara ne akan aikin da fasahohin da aka yi amfani da su a cikinsa, da kuma yadda waɗannan fasahohin ke cike da ka'idojin bincike. A ganina, ɗayan mahimman ma'auni yayin zabar kayan aikin SAST shine ikon tsara shi zuwa ƙayyadaddun aikace-aikacen ku, wato, rubutawa da canza ƙa'idodin bincike ko, kamar yadda ake kiran su sau da yawa, Tambayoyi na Musamman.

Yadda ake rubuta dokoki don Checkmarx ba tare da yin hauka ba

Mafi sau da yawa muna amfani da Checkmarx - mai ban sha'awa kuma mai nazarin lamba mai ƙarfi. A cikin wannan labarin zan yi magana game da gwaninta na rubuta ƙa'idodin bincike don shi.

Abubuwan da ke ciki

Gabatarwa

Da farko, Ina so in ba da shawarar ɗaya daga cikin ƴan labarai a cikin Rashanci game da fasalulluka na rubuta tambayoyin Checkmarx. An buga shi akan Habré a ƙarshen 2019 a ƙarƙashin taken: "Hello, Checkmarx!" Yadda ake rubuta tambayar Checkmarx SAST da nemo rashin lahani masu kyau.

Yana bincika dalla-dalla yadda ake rubuta tambayoyin farko a cikin CxQL (Checkmarx Query Language) don wasu aikace-aikacen gwaji kuma yana nuna ainihin ƙa'idodin yadda ƙa'idodin bincike ke aiki.

Ba zan sake maimaita abin da aka kwatanta a cikinsa ba, kodayake wasu hanyoyin za su kasance a nan. A cikin labarina zan yi ƙoƙarin tattara nau'in "tarin girke-girke", jerin hanyoyin magance takamaiman matsalolin da na ci karo da su yayin aiki na tare da Checkmarx. Dole ne in rataya kwakwalwata akan yawancin waɗannan matsalolin. Wani lokaci babu isassun bayanai a cikin takardun, kuma wani lokacin yana da wuya a fahimci yadda ake yin abin da ake buƙata. Ina fatan kwarewata da dare marar barci ba za su kasance a banza ba, kuma wannan "tarin girke-girke na Custom Queries" zai cece ku 'yan sa'o'i ko biyu na jijiyoyi. Don haka, bari mu fara!

Gabaɗaya bayanai akan dokoki

Da farko, bari mu kalli wasu ƴan dabaru na asali da tsarin aiki tare da ƙa'idodi, don ƙarin fahimtar abin da zai faru na gaba. Kuma kuma saboda takardun ba su ce komai game da wannan ba ko kuma an baje su sosai a cikin tsarin, wanda bai dace ba.

  1. Ana amfani da ƙa'idodin yayin dubawa dangane da saitattun da aka zaɓa a farawa (saitin dokoki masu aiki). Kuna iya ƙirƙirar adadin saitattu marasa iyaka, kuma daidai yadda ake tsara su ya dogara da ƙayyadaddun tsarin ku. Kuna iya haɗa su ta harshe ko zaɓi saitattun don kowane aikin. Adadin ƙa'idodin aiki yana rinjayar saurin da daidaito na dubawa.

    Yadda ake rubuta dokoki don Checkmarx ba tare da yin hauka baSaita saiti a cikin dubawar Checkmarx

  2. Ana gyara dokokin a cikin kayan aiki na musamman da ake kira CxAuditor. Wannan aikace-aikacen tebur ne wanda ke haɗi zuwa uwar garken da ke aiki da Checkmarx. Wannan kayan aiki yana da nau'ikan aiki guda biyu: ƙa'idodin gyarawa da nazarin sakamakon binciken da aka riga aka yi.

    Yadda ake rubuta dokoki don Checkmarx ba tare da yin hauka baCxAudit dubawa

  3. Dokoki a cikin Checkmarx an raba su ta harshe, wato, kowane harshe yana da nasa tsarin tambayoyin. Akwai kuma wasu ƙa'idodi na gaba ɗaya waɗanda ke aiki ba tare da la'akari da harshe ba, waɗannan su ne abin da ake kira tambayoyi na asali. Ga mafi yawancin, ainihin tambayoyin sun haɗa da neman bayanan da wasu ƙa'idodi ke amfani da su.

    Yadda ake rubuta dokoki don Checkmarx ba tare da yin hauka baRarraba dokoki da harshe

  4. Dokokin su ne "Za a iya aiwatarwa" da "Ba za a iya aiwatar da su ba" (An yi kuma ba a aiwatar da su ba). Ba daidai ba daidai sunan, a ganina, amma abin da yake shi ne. Layin ƙasa shine cewa za a nuna sakamakon aiwatar da dokokin "Executable" a cikin sakamakon binciken a cikin UI, kuma ana buƙatar ka'idodin "Ba za a iya aiwatarwa" kawai don amfani da sakamakon su a cikin wasu buƙatun (a zahiri, kawai aiki).

    Yadda ake rubuta dokoki don Checkmarx ba tare da yin hauka baƘayyade nau'in ƙa'ida lokacin ƙirƙirar

  5. Kuna iya ƙirƙirar sabbin dokoki ko kari/sake rubuta waɗanda suke. Domin sake rubuta ka'ida, kuna buƙatar nemo ta a cikin bishiyar, danna-dama kuma zaɓi "Sake" daga menu mai saukewa. Yana da mahimmanci a tuna a nan cewa sabbin dokoki ba a haɗa su da farko a cikin saitattun saiti kuma ba sa aiki. Don fara amfani da su kuna buƙatar kunna su a cikin menu na "Mai sarrafa Saiti" a cikin kayan aiki. Dokokin da aka sake rubutawa suna riƙe saitunan su, wato, idan dokar tana aiki, za ta kasance haka kuma za a yi amfani da ita nan take.

    Yadda ake rubuta dokoki don Checkmarx ba tare da yin hauka baMisalin sabuwar doka a cikin saiti na Manajan saiti

  6. A lokacin aiwatarwa, an gina "itace" na buƙatun, wanda ya dogara da abin da. Dokokin da ke tattara bayanai ana aiwatar da su ne da farko, kuma waɗanda ke amfani da su na biyu. Sakamakon aiwatarwa yana ɓoye, don haka idan yana yiwuwa a yi amfani da sakamakon da aka samu a cikin ƙa'idar data kasance, to yana da kyau a yi haka, wannan zai rage lokacin dubawa.

  7. Ana iya amfani da dokoki a matakai daban-daban:

  • Ga dukan tsarin - za a yi amfani da shi don kowane bincike na kowane aiki

  • A matakin ƙungiyar (Team) - za a yi amfani da shi kawai don bincika ayyukan a cikin ƙungiyar da aka zaɓa.

  • A matakin aikin - Za a yi amfani da shi a cikin takamaiman aikin

    Yadda ake rubuta dokoki don Checkmarx ba tare da yin hauka baƘayyade matakin da za a yi amfani da ƙa'idar

"Kamus" don masu farawa

Kuma zan fara da wasu ƴan abubuwan da suka jawo mini tambayoyi, kuma zan nuna wasu dabaru waɗanda za su sauƙaƙa rayuwa sosai.

Ayyuka tare da lissafin

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

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

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

Duk abubuwan da aka samo

A cikin yaren da aka bincika, zaku iya samun jerin duk abubuwan da Checkmarx ya gano ( kirtani, ayyuka, azuzuwan, hanyoyin, da sauransu). Wannan shi ne wasu sarari na abubuwa waɗanda za a iya isa ga ta All. Wato neman abu mai takamaiman suna searchMe, zaku iya bincika, misali, da suna a duk abubuwan da aka samo:

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

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

Amma, idan kuna buƙatar bincika cikin wani yare wanda saboda wasu dalilai ba a haɗa su a cikin binciken ba (misali, groovy a cikin aikin Android), zaku iya faɗaɗa sararin abin mu ta hanyar canji:

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

Ayyuka don nazarin Flow

Ana amfani da waɗannan ayyuka a cikin dokoki da yawa kuma ga ɗan littafin yaudara na abin da suke nufi:

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

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

Samun sunan fayil / hanya

Akwai halaye da yawa waɗanda za a iya samu daga sakamakon tambaya (sunan fayil ɗin da aka sami shigarwar, kirtani, da sauransu), amma takaddun ba su faɗi yadda ake samu da amfani da su ba. Don haka, don yin wannan, kuna buƙatar samun dama ga kayan LinePragma kuma abubuwan da muke buƙata za su kasance a ciki:

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

Yana da kyau a kiyaye hakan FileName ya ƙunshi ainihin hanyar zuwa fayil ɗin, tunda mun yi amfani da hanyar GetFirstGraph.

Sakamakon kisa

Akwai maɓalli na musamman a cikin CxQL result, wanda ke mayar da sakamakon aiwatar da rubutaccen doka. An fara shi nan da nan kuma zaku iya rubuta matsakaicin sakamako a ciki, canza da kuma tace su yayin da kuke aiki. Amma, idan babu wani aiki ga wannan canji ko aiki a cikin ƙa'idar return- sakamakon kisa koyaushe zai zama sifili.

Tambayar mai zuwa ba za ta mayar mana da komai ba sakamakon kisa kuma koyaushe za ta kasance fanko:

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

Amma, bayan sanya sakamakon kisa ga sakamakon canjin sihiri, za mu ga abin da wannan kiran ya dawo mana:

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

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

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

Amfani da sakamakon wasu dokoki

Dokoki a Checkmarx ana iya kiran su kwatankwacin ayyuka a cikin yaren shirye-shirye na yau da kullun. Lokacin rubuta ƙa'ida, ƙila za ku iya amfani da sakamakon wasu tambayoyin. Alal misali, babu buƙatar bincika duk kiran kira a cikin lambar kowane lokaci, kawai kira dokar da ake so:

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

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

Wannan tsarin yana ba ku damar rage lambar kuma rage yawan lokacin aiwatar da doka.

Magani na matsaloli

Shiga

Lokacin aiki tare da kayan aiki, wani lokacin ba zai yiwu a rubuta tambayar da ake so nan da nan ba kuma dole ne ku gwada, gwada zaɓuɓɓuka daban-daban. Don irin wannan yanayin, kayan aiki yana ba da shiga, wanda ake kira kamar haka:

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

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

Amma yana da kyau a tuna cewa wannan hanya tana karɓar kawai azaman shigarwa kirtani, don haka ba zai yiwu a nuna cikakken jerin abubuwan da aka samo ba sakamakon aikin farko. Zabi na biyu, wanda ake amfani da shi don gyara kurakurai, shine sanyawa ga mai canza sihiri daga lokaci zuwa lokaci result sakamakon tambayar ku ga me ya faru. Wannan hanyar ba ta dace sosai ba; kuna buƙatar tabbatar da cewa babu wani abin rufewa ko aiki tare da wannan a cikin lambar bayan result ko kuma kawai yin sharhi da lambar da ke ƙasa. Ko za ku iya, kamar ni, manta da cire irin waɗannan kira da yawa daga tsarin da aka shirya kuma kuyi mamakin dalilin da yasa babu abin da ke aiki.

Hanya mafi dacewa ita ce kiran hanyar return tare da sigar da ake buƙata. A wannan yanayin, aiwatar da dokar zai ƙare kuma za mu iya ganin abin da ya faru a sakamakon abin da muka rubuta:

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

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

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

Matsalar shiga

Akwai yanayi lokacin da ba za ku iya samun dama ga kayan aikin CxAudit (wanda ake amfani da shi don rubuta dokoki). Akwai dalilai da yawa na wannan, ciki har da hadarurruka, sabunta Windows kwatsam, BSOD da sauran abubuwan da ba a zata ba waɗanda suka wuce ikonmu. A wannan yanayin, wani lokacin akwai zaman da ba a gama ba a cikin ma'ajin bayanai, wanda ke hana ku sake shiga. Don gyara shi, kuna buƙatar gudanar da tambayoyi da yawa:

Don Checkmarx kafin 8.6:

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

Don Checkmarx bayan 8.6:

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

Dokokin rubutu

Yanzu mun kai ga mafi ban sha'awa sashi. Lokacin da ka fara rubuta dokoki a cikin CxQL, abin da sau da yawa ba ku da shi ba takardun da yawa ba ne kamar wasu misalai masu rai na warware wasu matsaloli da kuma kwatanta tsarin yadda tambayoyin ke aiki gaba ɗaya.

Zan yi ƙoƙari in sauƙaƙe rayuwa ga waɗanda suka fara nutsewa cikin yaren tambaya kuma in ba da misalai da yawa na amfani da Tambayoyi na Musamman don magance wasu matsaloli. Wasu daga cikinsu gabaɗaya ne kuma ana iya amfani da su a cikin kamfanin ku a zahiri ba tare da canje-canje ba, wasu sun fi takamaiman, amma kuma ana iya amfani da su ta hanyar canza lambar don dacewa da takamaiman aikace-aikacen ku.

Don haka, ga matsalolin da muka fi fuskanta akai-akai:

Aiki: Akwai kwarara da yawa a cikin sakamakon aiwatar da ka'ida kuma ɗayan su gida ne na wani, dole ne ku bar ɗaya daga cikinsu.

bayani: Tabbas, wani lokacin Checkmarx yana nuna kwararar bayanai da yawa waɗanda zasu iya mamayewa kuma su zama gajeriyar sigar wasu. Akwai hanya ta musamman don irin waɗannan lokuta Rage kwarara. Dangane da siga, zai zaɓi mafi guntu ko mafi tsayi:

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

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

Aiki: Fadada jerin mahimman bayanai waɗanda kayan aikin ke amsawa

bayani: Checkmarx yana da ƙa'idodi na asali, sakamakon waɗanda wasu tambayoyi da yawa ke amfani da su. Ta hanyar ƙara wasu daga cikin waɗannan ƙa'idodin tare da takamaiman bayanan aikace-aikacenku, zaku iya inganta sakamakon bincikenku nan da nan. A ƙasa akwai ƙa'idar misali don fara ku:

Jerin_keɓancewar_privacy

Bari mu ƙara sauye-sauye da yawa waɗanda ake amfani da su a cikin aikace-aikacen mu don adana mahimman bayanai:

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

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

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

Aiki: Fadada jerin masu canji tare da kalmomin shiga

bayani: Zan ba da shawarar ba da hankali nan da nan ga ainihin ƙa'idar don ayyana kalmomin shiga a lamba da ƙara masa jerin sunayen masu canji waɗanda aka saba amfani da su a cikin kamfanin ku.

Kalmomin sirri_privacy_jerin_keɓancewa

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

Aiki: Ƙara tsarin da aka yi amfani da su waɗanda ba su da tallafi daga Checkmarx

bayani: Duk tambayoyin da ke cikin Checkmarx an raba su ta harshe, don haka kuna buƙatar ƙara dokoki don kowane harshe. A ƙasa akwai wasu misalan irin waɗannan dokoki.

Idan ana amfani da ɗakunan karatu waɗanda suka dace ko maye gurbin daidaitattun ayyuka, ana iya ƙara su cikin sauƙi zuwa ƙa'idar asali. Sa'an nan duk wanda ya yi amfani da shi nan da nan zai koyi game da sababbin gabatarwar. Misali, dakunan karatu don shiga Android sune Timber da Loggi. A cikin ainihin fakitin, babu ƙa'idodi don gano kiran da ba na tsarin ba, don haka idan kalmar sirri ko mai gano zaman ta shiga cikin log ɗin, ba za mu san game da shi ba. Bari mu yi ƙoƙarin ƙara ma'anar irin waɗannan hanyoyin zuwa dokokin Checkmarx.

Gwajin misalin lambar da ke amfani da ɗakin karatu na katako don shiga:

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

Kuma ga misalin buƙatun Checkmarx, wanda zai ba ku damar ƙara ma'anar kiran hanyoyin Timber azaman hanyar fita don bayanai daga aikace-aikacen:

FindAndroidOutputs

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

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

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

Hakanan zaka iya ƙarawa zuwa ƙa'idar maƙwabta, amma wannan yana da alaƙa kai tsaye ga shiga Android:

NemoAndroidLog_Outputs

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

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

Hakanan, idan ana amfani da aikace-aikacen Android Mai sarrafa Aiki don aikin asynchronous, yana da kyau a ƙara sanar da Checkmarx game da wannan ta ƙara hanyar samun bayanai daga aikin. getInputData:

NemoAndroidRead

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

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

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

Aiki: Neman bayanai masu mahimmanci a cikin jerin ayyukan ayyukan iOS

bayani: iOS sau da yawa yana amfani da fayiloli na musamman tare da tsawo na .plist don adana ƙima da ƙima iri-iri. Ba a ba da shawarar adana kalmomin sirri, alamomi, maɓalli da sauran mahimman bayanai a cikin waɗannan fayilolin ba, saboda ana iya fitar da su daga na'urar ba tare da wata matsala ba.

Fayilolin Plist suna da fasalulluka waɗanda ba a bayyane suke ga ido tsirara ba, amma suna da mahimmanci ga Checkmarx. Bari mu rubuta ƙa'idar da za ta bincika bayanan da muke buƙata kuma mu gaya mana idan an ambaci kalmomin shiga ko alamu a wani wuri.

Misalin irin wannan fayil, wanda ya ƙunshi alamar sadarwa tare da sabis na baya:

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

Kuma ka'ida don Checkmarx, wanda ke da nuances da yawa waɗanda yakamata a yi la'akari yayin rubutawa:

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

Aiki: Neman Bayani a cikin XML

bayani: Checkmarx yana da ayyuka masu dacewa don aiki tare da XML da neman ƙima, alamomi, halaye da ƙari. Amma, abin takaici, an sami kuskure a cikin takaddun wanda babu misali ɗaya da ke aiki. Duk da cewa an kawar da wannan lahani a cikin sabon juzu'in takaddun, yi hankali idan kun yi amfani da nau'ikan takaddun da suka gabata.

Ga misalin da ba daidai ba daga takardun:

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

Sakamakon yunƙurin kisa, za mu sami kuskuren cewa All babu irin wannan hanyar ... Kuma wannan gaskiya ne, tun da akwai na musamman, sararin abu daban don amfani da ayyuka don aiki tare da XML - cxXPath. Wannan shine abin da madaidaicin tambayar yayi kama don nemo saiti a cikin Android wanda ke ba da damar amfani da zirga-zirgar HTTP:

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

Bari mu dubi shi dalla-dalla, tun da syntax ga duk ayyuka iri ɗaya ne, bayan kun gano ɗaya, to kawai kuna buƙatar zaɓar wanda kuke buƙata. Don haka, bi da bi bisa ga sigogi:

  • "*.xml"- abin rufe fuska na fayilolin da za a bincika

  • 8 - id na harshen da aka yi amfani da ƙa'idar

  • "cleartextTrafficPermitted"- sunan sifa a cikin xml

  • "true" - darajar wannan sifa

  • false - amfani da magana akai-akai lokacin bincike

  • true - yana nufin cewa za a yi binciken ne ba tare da kula da harka ba, wato, rashin jin daɗi

Misali, mun yi amfani da ka'ida da ke gano kuskure, ta fuskar tsaro, saitunan haɗin yanar gizo a cikin Android waɗanda ke ba da damar sadarwa tare da uwar garken ta hanyar ka'idar HTTP. Misalin saitin da ke ɗauke da sifa cleartextTrafficPermitted tare da ma'ana 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>

Aiki: Iyakance sakamako ta sunan fayil/hanyar

bayani: A cikin ɗayan manyan ayyukan da ke da alaƙa da haɓaka aikace-aikacen wayar hannu don Android, mun ci karo da ƙa'idodin ƙarya na ƙa'idar da ke ƙayyade saitin ɓoyewa. Gaskiyar ita ce, ƙa'idar daga cikin akwatin bincike a cikin fayil ɗin build.gradle saitin da ke da alhakin aiwatar da ƙa'idodin ɓarna don sigar sakin aikace-aikacen.

Amma a cikin manyan ayyuka wani lokacin akwai fayilolin yara build.gradle, wanda ke nufin ɗakunan karatu da aka haɗa a cikin aikin. Abin da ya bambanta shi ne cewa ko da waɗannan fayilolin ba su nuna buƙatar ɓoyewa ba, za a yi amfani da saitunan fayil ɗin taron iyaye yayin tattarawa.

Don haka, aikin shine katse abubuwan da ke haifar da yara a cikin fayilolin yara waɗanda ke na ɗakunan karatu. Ana iya gano su ta wurin kasancewar layin apply 'com.android.library'.

Misali code daga fayil build.gradle, wanda ke ƙayyade buƙatar ɓoyewa:

apply plugin: 'com.android.application'

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

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

dependencies {
  ...
}

Misalin fayil build.gradle don ɗakin karatu da aka haɗa a cikin aikin wanda ba shi da wannan saitin:

apply plugin: 'android-library'

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

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

Kuma ka'idar Checkmarx:

ProGuardObfuscationNotInAmfani

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

Wannan tsarin zai iya zama gama gari kuma yana da amfani ba kawai ga aikace-aikacen Android ba, har ma ga wasu lokuta lokacin da kuke buƙatar sanin ko sakamakon yana cikin takamaiman fayil.

Aiki: Ƙara goyan baya don ɗakin karatu na ɓangare na uku idan ba a sami cikakken goyan bayan rubutun ba

bayani: Adadin ginshiƙai daban-daban waɗanda ake amfani da su wajen aiwatar da lambar ba su da sauƙi a cikin ginshiƙi. Tabbas, Checkmarx ba koyaushe ya san wanzuwarsu ba, kuma aikinmu shine mu koya masa don fahimtar cewa wasu hanyoyin suna cikin wannan tsarin. Wani lokaci wannan yana da rikitarwa ta gaskiyar cewa tsarin yana amfani da sunaye na ayyuka waɗanda suka zama gama gari kuma ba shi yiwuwa a tantance dangantakar kira ta musamman zuwa takamaiman ɗakin karatu.

Wahalar ita ce, ba koyaushe ana gane ma'anar irin waɗannan ɗakunan karatu daidai ba kuma dole ne ku yi gwaji don guje wa samun adadi mai yawa na ƙimar ƙarya. Akwai zaɓuɓɓuka da yawa don inganta daidaiton dubawa da warware matsalar:

  • Zaɓin farko, mun san tabbas cewa ana amfani da ɗakin karatu a cikin takamaiman aikin kuma yana iya amfani da ƙa'ida a matakin ƙungiyar. Amma idan ƙungiyar ta yanke shawarar ɗaukar wata hanya ta daban ko kuma ta yi amfani da ɗakunan karatu da yawa waɗanda sunayen aikin suka mamaye, za mu iya samun hoto mai daɗi na ƙima da yawa.

  • Zabi na biyu shine bincika fayilolin da aka shigo da ɗakin karatu a cikinsu. Ta wannan hanyar, za mu iya tabbata cewa ɗakin karatu da muke buƙata ana amfani da shi daidai a cikin wannan fayil ɗin.

  • Kuma zaɓi na uku shine a yi amfani da hanyoyin biyu na sama tare.

A matsayin misali, bari mu kalli ɗakin karatu sananne a cikin ƙunƙun da'ira slick don harshen shirye-shiryen Scala, wato, ayyuka Rarraba Dabi'u na Gaskiya. Gabaɗaya, don ƙaddamar da sigogi zuwa tambayar SQL, dole ne ka yi amfani da afareta $, wanda ke musanya bayanai cikin tambayar SQL da aka riga aka tsara. Wato, a haƙiƙa, kwatankwacinsa ne kai tsaye na Bayanin Shirya a Java. Amma, idan kuna buƙatar ƙirƙirar tambaya ta SQL, misali, idan kuna buƙatar wuce sunayen tebur, zaku iya amfani da afaretan. #$, wanda zai maye gurbin bayanan kai tsaye a cikin tambayar (kusan kamar haɗin igiya).

Misali code:

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

Checkmarx har yanzu bai san yadda ake gano amfanin Splicing Literal Values ​​da tsallake masu aiki ba. #$, don haka bari mu yi ƙoƙarin koyar da shi don gano yuwuwar allurar SQL da haskaka wuraren da suka dace a cikin lambar:

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

Aiki: Nemo ayyuka masu rauni da aka yi amfani da su a cikin ɗakunan karatu na Buɗe-Source

bayani: Kamfanoni da yawa suna amfani da kayan aikin sa ido na Open-Source (OSA) don gano amfani da nau'ikan ɗakunan karatu masu rauni a cikin aikace-aikacen da aka haɓaka. Wani lokaci ba zai yiwu a sabunta irin wannan ɗakin karatu zuwa ingantaccen sigar ba. A wasu lokuta akwai iyakoki na aiki, a wasu kuma babu siga mai aminci kwata-kwata. A wannan yanayin, haɗuwa da ayyukan SAST da OSA zasu taimaka wajen ƙayyade cewa ba a amfani da ayyukan da ke haifar da amfani da raunin da ya faru a cikin lambar.

Amma wani lokacin, musamman idan aka yi la’akari da JavaScript, wannan na iya zama ba ƙaramin aiki gaba ɗaya ba. Da ke ƙasa akwai mafita, watakila ba manufa ba ne, amma duk da haka yana aiki, ta amfani da misalin rashin ƙarfi a cikin ɓangaren. lodash a cikin hanyoyin template и *set.

Misalai na gwaji mai yuwuwar lamba a cikin fayil 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!'

Kuma lokacin haɗi kai tsaye a cikin 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>

Muna neman duk hanyoyin mu masu rauni, waɗanda aka jera a cikin raunin:

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

Aiki: Neman takaddun shaida da aka saka a cikin aikace-aikacen

bayani: Ba sabon abu ba ne ga aikace-aikace, musamman na wayar hannu, don amfani da takaddun shaida ko maɓalli don samun dama ga sabar daban-daban ko tabbatar da SSL-Pinning. Daga yanayin tsaro, adana irin waɗannan abubuwa a cikin lamba ba shine mafi kyawun aiki ba. Bari mu yi ƙoƙarin rubuta ƙa'idar da za ta bincika fayiloli iri ɗaya a cikin ma'ajiyar:

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

Aiki: Nemo abubuwan da ba su dace ba a cikin aikace-aikacen

bayani: Yawancin lokaci ya zama dole a soke alamun da aka daidaita ko wasu mahimman bayanai waɗanda ke cikin lambar. Tabbas, adana su a cikin lambar tushe ba kyakkyawan ra'ayi bane, amma yanayi ya bambanta. Godiya ga tambayoyin CxQL, gano abubuwa kamar haka abu ne mai sauƙi:

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

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

ƙarshe

Ina fatan wannan labarin zai kasance da amfani ga waɗanda suka fara sanin su da kayan aikin Checkmarx. Wataƙila waɗanda suka daɗe suna rubuta ƙa'idodin kansu kuma za su sami wani abu mai amfani a cikin wannan jagorar.

Abin takaici, a halin yanzu akwai ƙarancin albarkatu inda za a iya tattara sabbin dabaru yayin haɓaka ƙa'idodin Checkmarx. Shi ya sa muka halitta wurin ajiya akan Github, inda za mu sanya aikin mu domin duk wanda ke amfani da CxQL ya sami wani abu mai amfani a cikinsa, sannan kuma ya samu damar raba ayyukansa ga al'umma. Ma'ajiyar tana kan aiwatar da cikawa da tsara abun ciki, don haka ana maraba da masu ba da gudummawa!

Na gode da hankali!

source: www.habr.com

Add a comment