Giunsa pagsulat ang mga lagda alang sa Checkmarx nga dili mabuang

Hoy Habr!

Sa among trabaho, ang among kompanya kanunay nga naghisgot sa lainlaing mga himan sa pagtuki sa static code (SAST). Gawas sa kahon silang tanan nagtrabaho nga kasagaran. Siyempre, kini tanan nagdepende sa proyekto ug sa mga teknolohiya nga gigamit niini, ingon man kung unsa ka maayo kini nga mga teknolohiya nasakop sa mga lagda sa pagtuki. Sa akong opinyon, usa sa labing hinungdanon nga pamatasan kung nagpili usa ka himan sa SAST mao ang abilidad nga ipasibo kini sa mga detalye sa imong mga aplikasyon, nga mao, pagsulat ug pagbag-o sa mga lagda sa pag-analisar o, ingon nga kini kanunay nga gitawag, Custom nga Mga Pangutana.

Giunsa pagsulat ang mga lagda alang sa Checkmarx nga dili mabuang

Kanunay namong gigamit ang Checkmarx - usa ka makaiikag kaayo ug gamhanan nga tig-analisar sa code. Niini nga artikulo maghisgot ako bahin sa akong kasinatian sa pagsulat sa mga lagda sa pagtuki alang niini.

Mga sulud sa sulud

entry

Sa pagsugod, gusto nakong irekomendar ang usa sa pipila ka mga artikulo sa Russian bahin sa mga bahin sa pagsulat sa mga pangutana alang sa Checkmarx. Gimantala kini sa Habré sa katapusan sa 2019 ubos sa titulo: "Hello, Checkmarx!" Giunsa pagsulat ang usa ka pangutana sa Checkmarx SAST ug pagpangita sa mga cool nga kahuyangan.

Gisusi niini ang detalye kung giunsa pagsulat ang unang mga pangutana sa CxQL (Checkmarx Query Language) para sa pipila ka aplikasyon sa pagsulay ug gipakita ang sukaranang mga prinsipyo kung giunsa paglihok ang mga lagda sa pagtuki.

Dili nako balikon kung unsa ang gihulagway niini, bisan kung adunay pipila ka mga interseksyon nga anaa gihapon. Sa akong artikulo ako mosulay sa pagtipon sa usa ka matang sa "pagkolekta sa mga resipe", usa ka listahan sa mga solusyon sa mga piho nga mga problema nga akong nasugatan sa panahon sa akong pagtrabaho uban sa Checkmarx. Kinahanglan nako nga pugngan ang akong utok sa daghang mga problema. Usahay walay igong impormasyon sa dokumentasyon, ug usahay lisud sabton kon unsaon pagbuhat ang gikinahanglan. Nanghinaut ko nga ang akong kasinatian ug mga gabii nga walay tulog dili makawang, ug kini nga "koleksiyon sa mga resipe sa Custom nga Pangutana" makaluwas kanimo og pipila ka oras o duha ka nerve cells. Busa, magsugod kita!

Kinatibuk-ang impormasyon sa mga lagda

Una, atong tan-awon ang pipila ka mga batakang konsepto ug ang proseso sa pagtrabaho uban sa mga lagda, alang sa usa ka mas maayo nga pagsabot sa unsay sunod nga mahitabo. Ug usab tungod kay ang dokumentasyon wala magsulti bisan unsa bahin niini o mikaylap kaayo sa istruktura, nga dili kaayo kombenyente.

  1. Ang mga lagda gigamit sa panahon sa pag-scan depende sa preset nga gipili sa pagsugod (usa ka set sa aktibo nga mga lagda). Makahimo ka og usa ka walay kinutuban nga gidaghanon sa mga preset, ug ang eksakto kung giunsa kini paghimo nagdepende sa mga detalye sa imong proseso. Mahimo nimong grupoon sila pinaagi sa pinulongan o pagpili og mga preset alang sa matag proyekto. Ang gidaghanon sa aktibo nga mga lagda makaapekto sa katulin ug katukma sa pag-scan.

    Giunsa pagsulat ang mga lagda alang sa Checkmarx nga dili mabuangPag-set up sa Preset sa Checkmarx interface

  2. Ang mga lagda gi-edit sa usa ka espesyal nga himan nga gitawag CxAuditor. Kini usa ka desktop application nga nagkonektar sa usa ka server nga nagdagan sa Checkmarx. Kini nga himan adunay duha ka mga paagi sa operasyon: pag-edit sa mga lagda ug pag-analisar sa mga resulta sa usa ka nahimo na nga pag-scan.

    Giunsa pagsulat ang mga lagda alang sa Checkmarx nga dili mabuangCxAudit interface

  3. Ang mga lagda sa Checkmarx gibahin sa pinulongan, nga mao, ang matag pinulongan adunay kaugalingong set sa mga pangutana. Adunay usab pipila ka mga kinatibuk-ang mga lagda nga magamit bisan unsa pa ang pinulongan, kini ang gitawag nga sukaranan nga mga pangutana. Sa kasagaran, ang sukaranang mga pangutana naglakip sa pagpangita sa impormasyon nga gigamit sa ubang mga lagda.

    Giunsa pagsulat ang mga lagda alang sa Checkmarx nga dili mabuangPagbahin sa mga lagda pinaagi sa pinulongan

  4. Ang mga lagda mao ang "Executable" ug "Non-Executable" (Executable ug Not Executable). Dili sakto nga ngalan, sa akong opinyon, apan mao kana. Ang hinungdan mao nga ang resulta sa pagpatuman sa "Executable" nga mga lagda ipakita sa mga resulta sa pag-scan sa UI, ug ang "Non-Executable" nga mga lagda gikinahanglan lamang aron magamit ang ilang mga resulta sa ubang mga hangyo (sa esensya, usa lang ka function).

    Giunsa pagsulat ang mga lagda alang sa Checkmarx nga dili mabuangPagtino sa matang sa lagda sa paghimo

  5. Makahimo ka ug bag-ong mga lagda o madugangan/isulat pag-usab ang mga naa na. Aron masulat pag-usab ang usa ka lagda, kinahanglan nimo nga pangitaon kini sa kahoy, pag-right-click ug pilia ang "Override" gikan sa drop-down menu. Importante nga hinumdoman dinhi nga ang bag-ong mga lagda wala sa sinugdanan gilakip sa mga preset ug dili aktibo. Sa pagsugod sa paggamit niini kinahanglan nimo nga i-aktibo kini sa menu nga "Preset Manager" sa instrumento. Ang gisulat nga mga lagda nagpabilin sa ilang mga setting, kana, kung ang lagda aktibo, kini magpabilin nga ingon ug magamit dayon.

    Giunsa pagsulat ang mga lagda alang sa Checkmarx nga dili mabuangPananglitan sa usa ka bag-ong lagda sa Preset Manager interface

  6. Atol sa pagpatuman, usa ka "kahoy" sa mga hangyo ang gitukod, nga nagdepende kung unsa. Ang mga lagda nga nagkolekta sa kasayuran gipatuman una, ug kadtong naggamit niini ikaduha. Ang resulta sa pagpatuman gi-cache, mao nga kung posible nga gamiton ang mga resulta sa usa ka kasamtangan nga lagda, nan mas maayo nga buhaton kini, kini makapakunhod sa oras sa pag-scan.

  7. Ang mga lagda mahimong magamit sa lainlaing lebel:

  • Alang sa tibuok nga sistema - gamiton alang sa bisan unsang pag-scan sa bisan unsang proyekto

  • Sa lebel sa team (Team) - gamiton ra sa pag-scan sa mga proyekto sa napili nga team.

  • Sa lebel sa proyekto - Ipadapat sa usa ka piho nga proyekto

    Giunsa pagsulat ang mga lagda alang sa Checkmarx nga dili mabuangPagtino sa lebel diin ang lagda magamit

"Diksyunaryo" para sa mga nagsugod

Ug magsugod ako sa pipila ka mga butang nga hinungdan sa akong mga pangutana, ug ipakita usab nako ang daghang mga teknik nga labi nga makapasimple sa kinabuhi.

Mga operasyon nga adunay mga lista

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

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

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

Tanan nga nakit-an nga mga butang

Sulod sa gi-scan nga lengguwahe, makakuha ka usa ka lista sa hingpit nga tanan nga mga elemento nga giila ni Checkmarx (mga kuwerdas, mga gimbuhaton, mga klase, pamaagi, ug uban pa). Kini ang pipila ka luna sa mga butang nga mahimong ma-access pinaagi sa All. Nga mao, sa pagpangita alang sa usa ka butang nga adunay usa ka piho nga ngalan searchMe, mahimo nimong pangitaon, pananglitan, pinaagi sa ngalan sa tanan nga nakit-an nga mga butang:

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

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

Apan, kung kinahanglan nimo pangitaon sa lain nga lengguwahe nga sa usa ka hinungdan wala gilakip sa pag-scan (pananglitan, groovy sa usa ka proyekto sa Android), mahimo nimong mapalapad ang among wanang sa butang pinaagi sa usa ka variable:

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

Mga Katungdanan para sa Pag-analisa sa Pag-agos

Kini nga mga gimbuhaton gigamit sa daghang mga lagda ug ania ang gamay nga cheat sheet kung unsa ang gipasabut niini:

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

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

Pagkuha sa ngalan/dalan sa file

Adunay ubay-ubay nga mga hiyas nga makuha gikan sa mga resulta sa usa ka pangutana (ang ngalan sa file diin ang entry nakit-an, string, ug uban pa), apan ang dokumentasyon wala magsulti kung unsaon pagkuha ug paggamit niini. Mao nga, aron mahimo kini, kinahanglan nimo nga ma-access ang kabtangan sa LinePragma ug ang mga butang nga kinahanglan namon mahimutang sa sulod niini:

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

Angay nga hinumdoman kana FileName naglangkob sa aktuwal nga agianan sa file, tungod kay gigamit namon ang pamaagi GetFirstGraph.

Resulta sa pagpatay

Adunay usa ka espesyal nga variable sa sulod sa CxQL result, nga nagbalik sa resulta sa pagpatuman sa imong sinulat nga lagda. Gisugdan dayon kini ug mahimo nimong isulat ang mga intermediate nga resulta niini, pagbag-o ug pagpino niini samtang nagtrabaho ka. Apan, kung walay assignment sa kini nga variable o function sulod sa lagda return- ang resulta sa pagpatuman kanunay nga zero.

Ang mosunud nga pangutana dili magbalik sa bisan unsa sa amon ingon usa ka sangputanan sa pagpatuman ug kanunay nga walay sulod:

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

Apan, nga gi-assign ang resulta sa pagpatay sa resulta sa magic variable, atong makita kung unsa ang gibalik niini nga tawag kanato:

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

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

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

Paggamit sa mga resulta sa ubang mga lagda

Ang mga lagda sa Checkmarx matawag nga susama sa mga gimbuhaton sa usa ka regular nga programming language. Sa pagsulat sa usa ka lagda, mahimo nimong gamiton ang mga resulta sa ubang mga pangutana. Pananglitan, dili kinahanglan nga pangitaon ang tanan nga mga tawag sa pamaagi sa code matag higayon, tawga lang ang gusto nga lagda:

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

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

Kini nga pamaagi nagtugot kanimo sa pagpamubo sa code ug sa kamahinungdanon nga pagkunhod sa oras sa pagpatuman sa lagda.

Solusyon sa mga problema

Pag-log

Kung nagtrabaho uban ang himan, usahay dili posible nga isulat dayon ang gitinguha nga pangutana ug kinahanglan nimo nga mag-eksperimento, pagsulay sa lainlaing mga kapilian. Alang sa ingon nga kaso, ang himan naghatag pag-log, nga gitawag ingon sa mosunod:

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

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

Apan angay nga hinumdoman nga kini nga pamaagi gidawat lamang ingon input hilo, mao nga dili posible nga ipakita ang usa ka kompleto nga lista sa nakit-an nga mga elemento ingon usa ka sangputanan sa una nga operasyon. Ang ikaduha nga kapilian, nga gigamit alang sa pag-debug, mao ang pag-assign sa usa ka magic variable matag karon ug unya result ang resulta sa pangutana ug tan-awa kung unsa ang mahitabo. Kini nga pamaagi dili kaayo kombenyente; kinahanglan nimo nga masiguro nga wala’y mga override o operasyon niini sa code pagkahuman result o i-comment lang ang code sa ubos. O mahimo nimo, sama kanako, makalimot sa pagtangtang sa daghang ingon nga mga tawag gikan sa usa ka andam nga lagda ug maghunahuna kung ngano nga wala’y molihok.

Ang usa ka mas sayon ​​​​nga paagi mao ang pagtawag sa pamaagi return uban ang gikinahanglan nga parameter. Niini nga kaso, ang pagpatuman sa lagda matapos ug atong makita kung unsa ang nahitabo isip resulta sa atong gisulat:

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

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

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

Problema sa pag-login

Adunay mga sitwasyon nga dili nimo ma-access ang CxAudit tool (nga gigamit sa pagsulat sa mga lagda). Mahimong adunay daghang mga hinungdan alang niini, lakip ang mga pag-crash, kalit nga pag-update sa Windows, BSOD ug uban pang wala damha nga mga sitwasyon nga dili nato makontrol. Sa kini nga kaso, usahay adunay wala mahuman nga sesyon sa database, nga nagpugong kanimo sa pag-log in pag-usab. Aron ayohon kini, kinahanglan nimo nga modagan ang daghang mga pangutana:

Para sa Checkmarx sa wala pa ang 8.6:

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

Para sa Checkmarx pagkahuman sa 8.6:

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

Mga lagda sa pagsulat

Karon kita moadto sa labing makapaikag nga bahin. Kung magsugod ka sa pagsulat sa mga lagda sa CxQL, ang kanunay nimong kulang dili kaayo daghang dokumentasyon sama sa pipila nga buhi nga mga pananglitan sa pagsulbad sa pipila nga mga problema ug paghulagway sa proseso kung giunsa ang mga pangutana nagtrabaho sa kinatibuk-an.

Akong paningkamutan nga himoong mas sayon ​​ang kinabuhi alang niadtong nagsugod sa pag-dive sa pangutana nga pinulongan ug paghatag og pipila ka mga pananglitan sa paggamit sa Custom nga mga Pangutana aron masulbad ang pipila ka mga problema. Ang uban niini kay kinatibuk-an ug mahimong magamit sa imong kompanya nga halos wala’y mga pagbag-o, ang uban mas espesipiko, apan mahimo usab kini gamiton pinaagi sa pagbag-o sa code aron mohaum sa mga detalye sa imong mga aplikasyon.

Mao nga, ania ang mga problema nga kanunay namon nasugatan:

Usa ka buluhaton: Adunay daghang mga Pag-agos sa mga resulta sa pagpatuman sa lagda ug ang usa niini usa ka salag sa lain, kinahanglan nimong biyaan ang usa niini.

solusyon: Sa tinuud, usahay ang Checkmarx nagpakita sa daghang mga daloy sa datos nga mahimong magsapaw ug mahimong usa ka pinamubo nga bersyon sa uban. Adunay usa ka espesyal nga pamaagi alang sa ingon nga mga kaso ReduceFlow. Depende sa parameter, pilion niini ang pinakamubo o pinakataas nga Flow:

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

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

Usa ka buluhaton: Pagpalapad sa lista sa sensitibo nga datos diin ang himan nag-reaksyon

solusyon: Ang Checkmarx adunay sukaranan nga mga lagda, ang mga resulta niini gigamit sa daghang uban pang mga pangutana. Pinaagi sa pagdugang sa pipila niini nga mga lagda nga adunay mga datos nga espesipiko sa imong aplikasyon, mahimo nimo nga mapaayo dayon ang imong mga resulta sa pag-scan. Sa ubos usa ka pananglitan nga lagda aron makasugod ka:

Kinatibuk-ang_privacy_violation_list

Atong idugang ang pipila ka mga baryable nga gigamit sa atong aplikasyon sa pagtipig sa sensitibo nga impormasyon:

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

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

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

Usa ka buluhaton: Pagpalapad sa lista sa mga variable nga adunay mga password

solusyon: Akong irekomendar nga hatagan dayon ug pagtagad ang sukaranang lagda alang sa pagtino sa mga password sa code ug pagdugang niini og lista sa mga variable nga ngalan nga sagad gigamit sa imong kompanya.

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

Usa ka buluhaton: Idugang ang gigamit nga mga balangkas nga wala gisuportahan sa Checkmarx

solusyon: Ang tanan nga mga pangutana sa Checkmarx gibahin sa lengguwahe, mao nga kinahanglan nimo nga idugang ang mga lagda alang sa matag pinulongan. Sa ubos mao ang pipila ka mga pananglitan sa maong mga lagda.

Kung ang mga librarya gigamit nga nagdugang o nagpuli sa standard nga pagpaandar, kini dali nga madugang sa sukaranan nga lagda. Dayon ang tanan nga mogamit niini makakat-on dayon mahitungod sa bag-ong mga pasiuna. Ingon nga pananglitan, ang mga librarya alang sa pag-log in sa Android mao ang Timber ug Loggi. Sa sukaranan nga pakete, wala’y mga lagda alang sa pag-ila sa mga tawag nga dili sistema, busa kung ang usa ka password o identifier sa sesyon mosulod sa log, dili kami mahibal-an bahin niini. Atong sulayan nga idugang ang mga kahulugan sa ingon nga mga pamaagi sa mga lagda sa Checkmarx.

Pananglitan sa pagsulay sa code nga naggamit sa librarya sa Timber alang sa pag-log:

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

Ug ania ang usa ka pananglitan sa usa ka hangyo alang sa Checkmarx, nga magtugot kanimo sa pagdugang usa ka kahulugan sa pagtawag sa mga pamaagi sa Timber ingon usa ka exit point alang sa datos gikan sa aplikasyon:

Pangitaa ang AndroidOutputs

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

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

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

Ug mahimo ka usab nga makadugang sa silingan nga lagda, apan kini direktang may kalabutan sa pag-log in sa Android:

Pangitaa ang AndroidLog_Outputs

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

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

Usab, kung gigamit ang mga aplikasyon sa Android WorkManager alang sa asynchronous nga trabaho, maayo nga ideya nga dugang ipahibalo ang Checkmarx bahin niini pinaagi sa pagdugang usa ka pamaagi sa pagkuha sa datos gikan sa buluhaton getInputData:

Pangitaa ang AndroidRead

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

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

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

Usa ka buluhaton: Pagpangita alang sa sensitibo nga datos sa plist alang sa mga proyekto sa iOS

solusyon: Ang iOS kanunay nga naggamit ug espesyal nga mga file nga adunay extension nga .plist aron matipigan ang lainlaing mga variable ug kantidad. Ang pagtipig sa mga password, mga token, mga yawe ug uban pang sensitibo nga datos niini nga mga file dili girekomendar, tungod kay kini mahimong makuha gikan sa device nga walay bisan unsa nga mga problema.

Ang mga file sa plist adunay mga bahin nga dili klaro sa mata, apan hinungdanon sa Checkmarx. Magsulat kita og usa ka lagda nga mangita sa datos nga atong gikinahanglan ug isulti kanamo kung ang mga password o mga token gihisgutan sa usa ka dapit.

Usa ka pananglitan sa ingon nga file, nga adunay usa ka timaan alang sa komunikasyon sa serbisyo sa backend:

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

Ug usa ka lagda alang sa Checkmarx, nga adunay daghang mga nuances nga kinahanglan nga tagdon sa pagsulat:

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

Usa ka buluhaton: Pagpangita sa Impormasyon sa XML

solusyon: Ang Checkmarx adunay kombenyente kaayo nga mga gimbuhaton alang sa pagtrabaho kauban ang XML ug pagpangita sa mga kantidad, tag, mga hiyas ug uban pa. Apan, ikasubo, adunay usa ka sayup sa dokumentasyon tungod kay wala’y usa ka pananglitan nga molihok. Bisan pa sa kamatuoran nga kini nga depekto nawagtang na sa pinakabag-o nga bersyon sa dokumentasyon, pag-amping kon mogamit ka sa naunang mga bersyon sa mga dokumento.

Ania ang usa ka dili husto nga pananglitan gikan sa dokumentasyon:

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

Ingon usa ka sangputanan sa pagsulay sa pagpatay, makadawat kami usa ka sayup nga All walay ingon nga pamaagi... Ug kini tinuod, tungod kay adunay usa ka espesyal, bulag nga butang nga luna alang sa paggamit sa mga gimbuhaton alang sa pagtrabaho uban sa XML - cxXPath. Kini ang hitsura sa husto nga pangutana aron makit-an ang usa ka setting sa Android nga nagtugot sa paggamit sa trapiko sa HTTP:

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

Atong tan-awon kini sa usa ka gamay nga dugang nga detalye, tungod kay ang syntax alang sa tanan nga mga gimbuhaton parehas, pagkahuman nimo mahibal-an ang usa, nan kinahanglan nimo nga pilion ang usa nga kinahanglan nimo. Busa, sunud-sunod sumala sa mga parameter:

  • "*.xml"- maskara sa mga file nga pangitaon

  • 8 — id sa pinulongan nga gigamit sa lagda

  • "cleartextTrafficPermitted"- ngalan sa attribute sa xml

  • "true" — ang bili niini nga hiyas

  • false — paggamit sa regular nga ekspresyon sa pagpangita

  • true — nagpasabot nga ang pagpangita himoon nga walay pagtagad sa kaso, nga mao, case-insensitive

Ingon usa ka pananglitan, gigamit namon ang usa ka lagda nga nagpaila sa dili husto, gikan sa punto sa seguridad, mga setting sa koneksyon sa network sa Android nga nagtugot sa komunikasyon sa server pinaagi sa HTTP protocol. Pananglitan sa usa ka setting nga adunay usa ka hiyas cleartextTrafficPermitted uban sa kahulogan 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>

Usa ka buluhaton: Limitahi ang mga resulta pinaagi sa ngalan sa file/dalan

solusyon: Sa usa sa mga dagkong proyekto nga may kalabutan sa pag-uswag sa usa ka mobile application alang sa Android, nakasugat kami og sayop nga mga positibo sa lagda nga nagtino sa obfuscation setting. Ang kamatuoran mao nga ang lagda sa gawas sa kahon nangita sa file build.gradle usa ka setting nga responsable sa pagpadapat sa mga lagda sa obfuscation alang sa pagpagawas nga bersyon sa aplikasyon.

Apan sa dagkong mga proyekto usahay adunay mga file sa bata build.gradle, nga nagtumong sa mga librarya nga gilakip sa proyekto. Ang talagsaon mao nga bisan kung kini nga mga file wala magpakita sa panginahanglan alang sa obfuscation, ang mga setting sa parent assembly file magamit sa panahon sa pag-compile.

Busa, ang tahas mao ang pagputol sa mga trigger sa mga file sa bata nga iya sa mga librarya. Mahimo silang mailhan pinaagi sa presensya sa linya apply 'com.android.library'.

Pananglitan nga code gikan sa file build.gradle, nga nagtino sa panginahanglan alang sa obfuscation:

apply plugin: 'com.android.application'

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

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

dependencies {
  ...
}

Pananglitan sa file build.gradle alang sa usa ka librarya nga gilakip sa proyekto nga wala niini nga setting:

apply plugin: 'android-library'

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

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

Ug ang lagda alang sa 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);
		}
	}
}

Kini nga pamaagi mahimo’g unibersal ug mapuslanon dili lamang alang sa mga aplikasyon sa Android, apan alang usab sa ubang mga kaso kung kinahanglan nimo mahibal-an kung ang usa ka sangputanan nahisakop sa usa ka piho nga file.

Usa ka buluhaton: Idugang ang suporta alang sa usa ka ikatulo nga partido nga librarya kung ang syntax dili hingpit nga gisuportahan

solusyon: Ang gidaghanon sa lain-laing mga frameworks nga gigamit sa proseso sa pagsulat code mao lamang sa mga tsart. Siyempre, ang Checkmarx dili kanunay nahibal-an bahin sa ilang paglungtad, ug ang among tahas mao ang pagtudlo niini aron masabtan nga ang pipila nga mga pamaagi espesipikong nahisakop sa kini nga balangkas. Usahay kini komplikado sa kamatuoran nga ang mga gambalay naggamit sa mga ngalan sa pag-obra nga komon kaayo ug imposible nga mahibal-an nga klaro ang relasyon sa usa ka partikular nga tawag sa usa ka piho nga librarya.

Ang kalisud mao nga ang syntax sa ingon nga mga librarya dili kanunay nga giila sa husto ug kinahanglan nimo nga mag-eksperimento aron malikayan ang daghang mga sayup nga positibo. Adunay daghang mga kapilian aron mapauswag ang katukma sa pag-scan ug masulbad ang problema:

  • Ang una nga kapilian, nahibal-an namon nga sigurado nga ang librarya gigamit sa usa ka piho nga proyekto ug mahimong magamit ang lagda sa lebel sa team. Apan kung ang team modesisyon nga mohimo ug lahi nga pamaagi o mogamit daghang mga librarya diin ang mga ngalan sa function nagsapaw, makakuha kami usa ka dili kaayo nindot nga litrato sa daghang mga sayup nga positibo.

  • Ang ikaduha nga kapilian mao ang pagpangita alang sa mga file diin ang librarya klaro nga gi-import. Uban niini nga pamaagi, kita makasiguro nga ang librarya nga atong gikinahanglan kay gigamit sa niini nga file.

  • Ug ang ikatulo nga kapilian mao ang paggamit sa duha nga mga pamaagi sa ibabaw nga magkauban.

Ingong pananglitan, atong tan-awon ang usa ka librarya nga ilado sa pig-ot nga mga lingin hinay alang sa Scala programming language, nga mao, ang functionality Pagdugtong sa Literal nga mga Mithi. Sa kinatibuk-an, aron mapasa ang mga parameter sa usa ka pangutana sa SQL, kinahanglan nimo gamiton ang operator $, nga nag-ilis sa datos ngadto sa usa ka preformed SQL query. Kana, sa tinuud, kini usa ka direkta nga analogue sa Prepared Statement sa Java. Apan, kung kinahanglan nimo nga dinamikong maghimo usa ka pangutana sa SQL, pananglitan, kung kinahanglan nimo nga ipasa ang mga ngalan sa lamesa, mahimo nimong gamiton ang operator. #$, nga direktang mopuli sa datos ngadto sa pangutana (halos sama sa string concatenation).

Sample code:

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

Wala pa mahibal-an ni Checkmarx kung giunsa mahibal-an ang paggamit sa Splicing Literal Values ​​ug paglaktaw sa mga operator #$, busa atong sulayan ang pagtudlo niini sa pag-ila sa mga potensyal nga SQL injection ug i-highlight ang husto nga mga dapit sa code:

// Находим все импорты
CxList imports = All.FindByType(typeof(Import));

// Ищем по имени, есть ли в импортах slick
CxList slick = imports.FindByShortName("slick");

// Некоторый флаг, определяющий, что импорт библиотеки в коде присутствует
// Для более точного определения - можно применить подход с именем файла
bool not_empty_list = false;
foreach (CxList r in slick)
{
    // Если встретили импорт, считаем, что slick используется
	not_empty_list = true;
}

if (not_empty_list) {
    // Ищем вызовы, в которые передается SQL-строка
	CxList sql = All.FindByShortName("sql");
	sql.Add(All.FindByShortName("sqlu"));
	
	// Определяем данные, которые попадают в эти вызовы
	CxList data_sql = All.DataInfluencingOn(sql);
	
	// Так как синтакис не поддерживается, можно применить подход с регулярными выражениями
	// RegExp стоит использовать крайне осторожно и не применять его на большом количестве данных, так как это может сильно повлиять на производительность
	CxList find_possible_inj = data_sql.FindByRegex(@"#$", true, true, true);

    // Избавляемся от лишних срабатываний, если они есть и выводим в результат
	result = find_possible_inj.FindByType(typeof(BinaryExpr));
}

Usa ka buluhaton: Pangitaa ang gigamit nga huyang nga mga gimbuhaton sa Open-Source nga mga librarya

solusyon: Daghang mga kompanya ang naggamit sa Open-Source monitoring tools (OSA practice) aron mahibal-an ang paggamit sa mga huyang nga bersyon sa mga librarya sa mga naugmad nga aplikasyon. Usahay dili posible nga i-update ang ingon nga librarya sa usa ka luwas nga bersyon. Sa pipila ka mga kaso adunay mga limitasyon sa pag-andar, sa uban wala’y luwas nga bersyon. Sa kini nga kaso, ang usa ka kombinasyon sa mga pamaagi sa SAST ug OSA makatabang sa pagtino nga ang mga gimbuhaton nga nagdala sa pagpahimulos sa pagkahuyang wala gigamit sa code.

Apan usahay, labi na kung gikonsiderar ang JavaScript, mahimo’g dili kini usa ka bug-os nga wala’y hinungdan nga buluhaton. Sa ubos usa ka solusyon, tingali dili maayo, apan bisan pa niana nagtrabaho, gamit ang panig-ingnan sa mga kahuyangan sa sangkap lodash sa mga pamaagi template и *set.

Mga pananglitan sa pagsulay nga posibleng mahuyang nga code sa usa ka JS file:

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

Ug kung direktang nagkonektar sa 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>

Gipangita namo ang tanan namong huyang nga mga pamaagi, nga gilista sa mga kahuyangan:

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

Usa ka buluhaton: Pagpangita alang sa mga sertipiko nga gilakip sa aplikasyon

solusyon: Kasagaran alang sa mga aplikasyon, labi na sa mga mobile, nga mogamit mga sertipiko o yawe aron ma-access ang lainlaing mga server o pag-verify sa SSL-Pinning. Gikan sa usa ka panan-aw sa seguridad, ang pagtipig sa ingon nga mga butang sa code dili ang labing kaayo nga praktis. Atong sulayan ang pagsulat sa usa ka lagda nga mangita alang sa susama nga mga file sa 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;

Usa ka buluhaton: Pagpangita mga nakompromiso nga mga token sa aplikasyon

solusyon: Kanunay gikinahanglan nga bawion ang mga nakompromiso nga mga token o uban pang importante nga impormasyon nga anaa sa code. Siyempre, ang pagtipig niini sa sulod sa source code dili maayo nga ideya, apan lainlain ang mga sitwasyon. Salamat sa mga pangutana sa CxQL, ang pagpangita sa mga butang nga sama niini dali ra:

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

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

konklusyon

Nanghinaut ko nga kini nga artikulo mahimong mapuslanon sa mga nagsugod sa ilang kaila sa himan sa Checkmarx. Tingali kadtong nagsulat sa ilang kaugalingong mga lagda sa dugay nga panahon makakita usab og butang nga mapuslanon niini nga giya.

Ikasubo, sa pagkakaron adunay kakulang sa usa ka kapanguhaan diin ang mga bag-ong ideya mahimong makuha sa panahon sa pagpalambo sa mga lagda alang sa Checkmarx. Mao nga naghimo kami repository sa Github, diin among i-post ang among trabaho aron ang tanan nga nagagamit sa CxQL makakitag butang nga mapuslanon niini, ug makabaton usab ug kahigayonan sa pagpaambit sa ilang trabaho sa komunidad. Ang repository anaa sa proseso sa pagpuno ug pag-istruktura sa sulod, busa ang mga kontribyutor giabiabi!

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

Source: www.habr.com

Idugang sa usa ka comment