Ahoana ny fanoratana fitsipika ho an'ny Checkmarx nefa tsy adala

Hey Habr!

Amin'ny asantsika, ny orinasanay dia matetika mifandray amin'ny fitaovana famakafakana kaody static (SAST). Avy amin'ny boaty izy rehetra dia miasa amin'ny salan'isa. Mazava ho azy fa miankina amin'ny tetikasa sy ny teknolojia ampiasaina ao anatiny izany rehetra izany, ary koa ny fandrakofana ireo teknolojia ireo amin'ny fitsipiky ny fanadihadiana. Raha ny hevitro, ny iray amin'ireo fepetra manan-danja indrindra amin'ny fisafidianana fitaovana SAST dia ny fahafahana mampifanaraka azy amin'ny antsipiriany amin'ny fampiharanao, izany hoe, manoratra sy manova ny fitsipiky ny fanadihadiana na, araka ny iantsoana azy matetika, Custom Query.

Ahoana ny fanoratana fitsipika ho an'ny Checkmarx nefa tsy adala

Matetika izahay no mampiasa Checkmarx - mpanadihady kaody tena mahaliana sy mahery. Ato amin'ity lahatsoratra ity aho dia hiresaka momba ny traikefako amin'ny fanoratana fitsipika fanadihadiana momba izany.

Lohahevitra misy

teny

Hanombohana, tiako ny hanoro ny iray amin'ireo lahatsoratra vitsivitsy amin'ny teny Rosiana momba ny endri-panoratana fanontaniana momba ny Checkmarx. Navoaka tao amin'ny Habré tamin'ny faran'ny taona 2019 tamin'ny lohateny hoe: "Manahoana, Checkmarx!" Ahoana ny fanoratana fanontaniana Checkmarx SAST ary hahitana ireo vulnerability mahafinaritra.

Izy io dia mandinika amin'ny antsipiriany ny fomba fanoratana ny fanontaniana voalohany amin'ny CxQL (Checkmarx Query Language) ho an'ny fampiharana fitsapana sasany ary mampiseho ireo fitsipika fototra amin'ny fomba fiasan'ny fitsipika fanadihadiana.

Tsy haveriko intsony izay voalaza ao, na dia mbola hisy sampanan-dalana aza. Ao amin'ny lahatsoratro dia hiezaka ny hanangona karazana "famoriam-bola" aho, lisitry ny vahaolana amin'ny olana manokana izay sendra ahy nandritra ny asako tamin'ny Checkmarx. Tsy maintsy nitaky ny saiko aho tamin'ny ankamaroan'ireo olana ireo. Indraindray dia tsy ampy ny fampahalalana ao amin'ny antontan-taratasy, ary indraindray dia sarotra ny mahatakatra ny fomba hanaovana izay takiana. Manantena aho fa tsy ho very maina ny traikefako sy ny alina tsy mahita tory, ary ity "fanangonana resadresaka momba ny fanontaniana manokana" ity dia hamonjy anao ora vitsivitsy na sela nerveuse roa. Noho izany, andao hanomboka!

Fampahalalana ankapobeny momba ny fitsipika

Voalohany, andeha hojerentsika ireo foto-kevitra fototra vitsivitsy sy ny fizotran'ny fiaraha-miasa amin'ny fitsipika, mba hahafantarana bebe kokoa ny zavatra hitranga manaraka. Ary koa satria ny antontan-taratasy dia tsy milaza na inona na inona momba izany na miparitaka be ao amin'ny rafitra, izay tsy dia mety loatra.

  1. Ny fitsipika dia ampiharina mandritra ny fitarafana miankina amin'ny preset nofantenana eo am-piandohana (fitsipika mavitrika). Afaka mamorona preset tsy misy fetra ianao, ary ny fomba handrafetana azy ireo dia miankina amin'ny antsipiriany amin'ny fizotranao. Azonao atao ny manangona azy ireo amin'ny fiteny na misafidy preset ho an'ny tetikasa tsirairay. Ny isan'ny fitsipika mavitrika dia misy fiantraikany amin'ny hafainganam-pandeha sy ny fahamarinan'ny scan.

    Ahoana ny fanoratana fitsipika ho an'ny Checkmarx nefa tsy adalaFametrahana Preset ao amin'ny interface Checkmarx

  2. Ny fitsipika dia ovaina amin'ny fitaovana manokana antsoina hoe CxAuditor. Ity dia fampiharana desktop izay mifandray amin'ny mpizara iray mihazakazaka Checkmarx. Ity fitaovana ity dia manana fomba fiasa roa: fanitsiana fitsipika sy famakafakana ny vokatry ny scan efa vita.

    Ahoana ny fanoratana fitsipika ho an'ny Checkmarx nefa tsy adalaCxAudit interface tsara

  3. Ny fitsipika ao amin'ny Checkmarx dia zaraina amin'ny fiteny, izany hoe ny fiteny tsirairay dia manana ny antontan-taratasiny manokana. Misy ihany koa ny fitsipika ankapobeny izay mihatra na inona na inona fiteny, ireo no antsoina hoe fanontaniana fototra. Amin'ny ankamaroan'ny toe-javatra, ny fanontaniana fototra dia ny fitadiavana fampahalalana izay ampiasain'ny fitsipika hafa.

    Ahoana ny fanoratana fitsipika ho an'ny Checkmarx nefa tsy adalaFizarana fitsipika amin'ny fiteny

  4. Ny fitsipika dia "Azo tanterahana" sy "Tsy azo tanterahana" (Vonona fa tsy tanterahana). Tsy ny anarana marina, raha ny hevitro, fa izay no izy. Ny tsipika ambany dia ny vokatry ny fampiharana ny fitsipika "Executable" dia haseho amin'ny valin'ny scan ao amin'ny UI, ary ny fitsipika "Tsy azo tanterahana" dia ilaina raha tsy mampiasa ny valiny amin'ny fangatahana hafa (raha ny tena izy, asa fotsiny).

    Ahoana ny fanoratana fitsipika ho an'ny Checkmarx nefa tsy adalaFamaritana ny karazana fitsipika rehefa mamorona

  5. Azonao atao ny mamorona fitsipika vaovao na manampy / mamerina manoratra ny efa misy. Raha te hanoratra fitsipika iray ianao dia mila mahita izany ao amin'ny hazo, tsindrio havanana ary safidio ny "Override" ao amin'ny menio midina. Zava-dehibe ny mitadidy eto fa ny fitsipika vaovao dia tsy tafiditra ao amin'ny preset ary tsy mavitrika. Mba hanombohana mampiasa azy ireo dia mila manetsika azy ireo ianao ao amin'ny menio "Preset Manager" ao amin'ny fitaovana. Ny fitsipika naverina nosoratana dia mitazona ny firafiny, izany hoe raha navitrika ilay fitsipika, dia hijanona ho toy izany ary hampiharina avy hatrany.

    Ahoana ny fanoratana fitsipika ho an'ny Checkmarx nefa tsy adalaOhatra amin'ny fitsipika vaovao ao amin'ny interface Preset Manager

  6. Mandritra ny famonoana dia atsangana ny "hazo" fangatahana, izay miankina amin'ny inona. Ny fitsipika manangona vaovao dia tanterahina voalohany, ary ireo izay mampiasa izany faharoa. Ny valin'ny famonoana dia voatahiry, ka raha azo atao ny mampiasa ny vokatry ny fitsipika efa misy, dia tsara kokoa ny manao izany, hampihena ny fotoana scanning.

  7. Ny fitsipika dia azo ampiharina amin'ny ambaratonga samihafa:

  • Ho an'ny rafitra iray manontolo - dia hampiasaina amin'ny fisavana ny tetikasa rehetra

  • Eo amin'ny sehatry ny ekipa (Ekipa) - dia hampiasaina handinihana tetikasa ao amin'ny ekipa voafantina ihany.

  • Amin'ny ambaratongan'ny tetikasa - Ho ampiharina amin'ny tetikasa manokana

    Ahoana ny fanoratana fitsipika ho an'ny Checkmarx nefa tsy adalaFamaritana ny haavon'ny fampiharana ny fitsipika

"Rakibolana" ho an'ny vao manomboka

Ary hatomboko amin'ny zavatra vitsivitsy izay nahatonga ahy fanontaniana, ary hasehoko ihany koa ny teknika maromaro izay hanatsotra ny fiainana.

Hetsika misy lisitra

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

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

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

Zavatra hita rehetra

Ao anatin'ny fiteny notarafina dia afaka mahazo lisitry ny singa rehetra izay hitan'i Checkmarx ianao (tady, fiasa, kilasy, fomba, sns.). Ity dia habaka misy zavatra azo idirana All. Izany hoe mitady zavatra manana anarana manokana searchMe, azonao atao ny mikaroka, ohatra, amin'ny anarana amin'ny zavatra hita rehetra:

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

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

Saingy, raha mila mikaroka amin'ny fiteny hafa ianao izay tsy nampidirina tao amin'ny scan (ohatra, groovy amin'ny tetikasa Android), azonao atao ny manitatra ny habaka misy antsika amin'ny alàlan'ny variable:

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

Functions ho an'ny fanadihadiana Flow

Ireo fiasa ireo dia ampiasaina amin'ny fitsipika maro ary ity misy takelaka kely momba ny dikany:

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

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

Fahazoana anarana fisie/lalana

Misy toetra maromaro azo raisina avy amin'ny valin'ny fanontaniana iray (ny anaran'ny rakitra nahitana ny fidirana, tady, sns.), saingy ny antontan-taratasy dia tsy milaza ny fomba hahazoana sy fampiasana azy ireo. Noho izany, mba hanaovana izany dia mila miditra amin'ny fananana LinePragma ianao ary ny zavatra ilaintsika dia ho hita ao anatiny:

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

Ilaina ny mitadidy izany FileName misy ny lalana mankany amin'ny rakitra, satria nampiasa ny fomba izahay GetFirstGraph.

Vokatry ny famonoana

Misy variable manokana ao anatin'ny CxQL result, izay mamerina ny vokatry ny fanatanterahana ny fitsipikao an-tsoratra. Atomboka avy hatrany izany ary azonao atao ny manoratra valiny manelanelana ao anatiny, manova sy manadio azy ireo rehefa miasa. Saingy, raha tsy misy fanendrena amin'ity fari-pitsipika na fiasa ity ao anatin'ny fitsipika return- ho aotra foana ny vokatra famonoana.

Ity fanontaniana manaraka ity dia tsy hamerina na inona na inona amintsika vokatry ny famonoana ary ho foana foana:

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

Saingy, rehefa nanendry ny valin'ny famonoana ho an'ny valin'ny miovaova majika, dia ho hitantsika ny fiverenan'ity antso ity amintsika:

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

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

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

Mampiasa ny vokatry ny fitsipika hafa

Ny fitsipika ao amin'ny Checkmarx dia azo antsoina hoe mitovy amin'ny fiasa amin'ny fiteny fandaharana mahazatra. Rehefa manoratra fitsipika dia azonao ampiasaina tsara ny valin'ny fanontaniana hafa. Ohatra, tsy ilaina ny mikaroka ny fomba fiantsoana rehetra ao amin'ny kaody isaky ny miantso ny fitsipika irina:

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

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

Ity fomba fiasa ity dia ahafahanao manafohy ny kaody ary mampihena be ny fotoana fampiharana ny fitsipika.

Famahana olana

logging

Rehefa miasa miaraka amin'ny fitaovana, indraindray dia tsy azo atao ny manoratra avy hatrany ny fanontaniana tianao ary tsy maintsy manandrana ianao, manandrana safidy samihafa. Ho an'ny tranga toy izany, ny fitaovana dia manome logging, izay antsoina hoe:

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

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

Saingy tokony ho tsaroana fa ity fomba ity dia manaiky fotsiny ho fampidirana tady, noho izany dia tsy ho azo atao ny mampiseho lisitra feno ireo singa hita vokatry ny fandidiana voalohany. Ny safidy faharoa, izay ampiasaina amin'ny debugging, dia ny manendry ny ody ody tsindraindray result ny vokatry ny fanontaniana ary jereo izay mitranga. Tsy dia mety loatra ity fomba fiasa ity; mila mahazo antoka ianao fa tsy misy fanodinkodinana na asa miaraka amin'ity ao amin'ny kaody aorian'ny result na asio commentaire ny code eto ambany. Na azonao atao, toa ahy, ny manadino ny manala antso maro toy izany amin'ny fitsipika efa vita ary manontany tena hoe nahoana no tsy misy mandeha.

Ny fomba mety kokoa dia ny miantso ny fomba return miaraka amin'ny parameter ilaina. Amin'ity tranga ity, hifarana ny fampiharana ny fitsipika ary ho hitantsika ny zava-nitranga vokatry ny zavatra nosoratanay:

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

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

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

Olana fidirana

Misy toe-javatra tsy afaka miditra amin'ny fitaovana CxAudit (izay ampiasaina hanoratana fitsipika). Mety misy antony maro mahatonga izany, anisan'izany ny fianjerana, ny fanavaozana Windows tampoka, ny BSOD ary ny toe-javatra tsy ampoizina hafa izay tsy voafehintsika. Amin'ity tranga ity, indraindray dia misy fivoriana tsy vita ao amin'ny tahiry, izay manakana anao tsy hiditra indray. Mba hamahana izany dia mila mametraka fanontaniana maromaro ianao:

Ho an'ny Checkmarx alohan'ny 8.6:

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

Ho an'ny Checkmarx aorian'ny 8.6:

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

Fitsipika fanoratana

Ankehitriny dia tonga amin'ny ampahany mahaliana indrindra isika. Rehefa manomboka manoratra fitsipika ao amin'ny CxQL ianao, ny zavatra tsy ampy matetika dia tsy ny antontan-taratasy be loatra fa ny ohatra velona sasany amin'ny famahana olana sasany sy ny famaritana ny fizotran'ny fomba fiasa amin'ny ankapobeny.

Hiezaka aho hanamora ny fiainana ho an'ireo izay manomboka mitsoraka amin'ny fiteny manontany ary hanome ohatra maromaro amin'ny fampiasana Custom Query hamahana olana sasany. Ny sasany amin'izy ireo dia tena ankapobeny ary azo ampiasaina ao amin'ny orinasanao saika tsy misy fiovana, ny hafa dia voafaritra kokoa, saingy azo ampiasaina amin'ny fanovana ny kaody hifanaraka amin'ny mombamomba ny fampiharanao.

Noho izany, ireto ny olana sedrainay matetika:

Asa iray: Misy Flows maromaro amin'ny vokatry ny fampiharana ny fitsipika ary ny iray amin'izy ireo dia fanatobiana iray hafa, tsy maintsy miala amin'ny iray amin'izy ireo ianao.

vahaolana: Eny tokoa, indraindray ny Checkmarx dia mampiseho fikorianan'ny angon-drakitra maromaro izay mety hifanindry ary ho dika nohafohezina an'ny hafa. Misy fomba manokana ho an'ny tranga toy izany ReduceFlow. Miankina amin'ny mari-pamantarana no hifidianany ny Flow fohy indrindra na lava indrindra:

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

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

Asa iray: Ampitomboy ny lisitr'ireo angona saro-pady amin'ny fihetsik'ilay fitaovana

vahaolana: Manana fitsipika fototra i Checkmarx, izay ampiasain'ny fanontaniana maro hafa ny valiny. Amin'ny famenoana ny sasany amin'ireo fitsipika ireo miaraka amin'ny angona manokana amin'ny fampiharanao dia azonao atao ny manatsara avy hatrany ny valin'ny scan. Ity misy ohatra fitsipika iray hanombohana anao:

Lisitra_fanitsakitsahana_ankapobeny

Andao hanampy fari-pahalalana maromaro ampiasaina amin'ny fampiharana ataontsika hitahiry vaovao saro-pady:

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

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

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

Asa iray: Hanitatra ny lisitry ny fari-piainana misy tenimiafina

vahaolana: Manoro hevitra avy hatrany aho hijery ny fitsipika fototra amin'ny famaritana ny tenimiafina amin'ny kaody ary manampy azy io ny lisitry ny anarana miovaova izay matetika ampiasaina ao amin'ny orinasanao.

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

Asa iray: Ampio rafitra efa nampiasaina izay tsy tohanan'ny Checkmarx

vahaolana: Ny fanontaniana rehetra ao amin'ny Checkmarx dia zaraina amin'ny fiteny, ka mila manampy fitsipika ho an'ny fiteny tsirairay ianao. Ireto ambany ireto ny ohatra sasantsasany amin'ny fitsipika toy izany.

Raha ampiasaina ny tranomboky mameno na manolo ny fiasa mahazatra, dia azo ampidirina amin'ny fitsipika fototra izy ireo. Avy eo izay rehetra mampiasa azy io dia hianatra avy hatrany momba ny fampidirana vaovao. Ohatra, ny tranomboky ho an'ny fidirana amin'ny Android dia Timber sy Loggi. Ao amin'ny fonosana fototra, tsy misy fitsipika momba ny famantarana ny antso tsy misy rafitra, ka raha misy tenimiafina na famantarana session miditra ao anaty log, dia tsy ho fantatsika izany. Andeha isika hanampy ny famaritana ny fomba toy izany amin'ny fitsipika Checkmarx.

Ohatra kaody andrana izay mampiasa ny tranomboky Timber ho an'ny logging:

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

Ary ity misy ohatra iray amin'ny fangatahana Checkmarx, izay ahafahanao manampy famaritana ny fiantsoana ny fomba Timber ho toerana fivoahana ny angona avy amin'ny fampiharana:

FindAndroidOutputs

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

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

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

Ary azonao atao koa ny manampy amin'ny fitsipika manodidina, fa ity iray ity dia mifandray mivantana amin'ny fidirana amin'ny Android:

FindAndroidLog_Outputs

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

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

Ary koa, raha mampiasa fampiharana Android WorkManager ho an'ny asa asynchronous, hevitra tsara ny mampahafantatra an'i Checkmarx momba izany amin'ny alàlan'ny fampidirana fomba hahazoana angona avy amin'ilay asa. getInputData:

FindAndroidRead

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

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

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

Asa iray: Mikaroka angona saro-pady amin'ny plist ho an'ny tetikasa iOS

vahaolana: Matetika ny iOS dia mampiasa rakitra manokana miaraka amin'ny fanitarana .plist mba hitahiry ireo fari-pahalalana sy soatoavina isan-karazany. Ny fitehirizana tenimiafina, famantarana, lakile ary angona saro-pady hafa ao anatin'ireo rakitra ireo dia tsy soso-kevitra, satria azo alaina amin'ny fitaovana tsy misy olana.

Ny rakitra Plist dia manana endri-javatra tsy hita maso, fa zava-dehibe amin'ny Checkmarx. Andeha hanoratra fitsipika izay hikaroka ny angon-drakitra ilaintsika ary hilaza aminay raha misy tenimiafina na marika voatonona any ho any.

Ohatra iray amin'ny rakitra toy izany, izay misy famantarana ho an'ny fifandraisana amin'ny serivisy 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>

Ary fitsipika iray ho an'ny Checkmarx, izay misy nuance maromaro tokony hodinihina rehefa manoratra:

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

Asa iray: Mitady fampahalalana amin'ny XML

vahaolana: Ny Checkmarx dia manana fiasa tena mety amin'ny fiasana amin'ny XML sy ny fitadiavana soatoavina, marika, toetra ary maro hafa. Saingy, indrisy, nisy lesoka tao amin'ny antontan-taratasy izay tsy misy ohatra iray miasa. Na dia eo aza ny zava-misy fa io kilema io dia nesorina tao amin'ny kinova farany an'ny antontan-taratasy, mitandrema raha mampiasa dikan-drakitra taloha ianao.

Ity misy ohatra diso avy amin'ny antontan-taratasy:

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

Vokatry ny andrana famonoana dia hahazo lesoka izay isika All tsy misy fomba toy izany... Ary marina izany, satria misy toerana manokana sy misaraka ho an'ny fampiasana ny fiasa miasa amin'ny XML - cxXPath. Toy izao ny endrik'ilay fanontaniana marina hahitana toerana ao amin'ny Android mamela ny fampiasana ny fifamoivoizana HTTP:

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

Andeha hojerentsika izany amin'ny antsipiriany bebe kokoa, satria mitovy ny syntax ho an'ny fiasa rehetra, rehefa avy nahafantatra ny iray ianao dia mila mifidy izay ilainao fotsiny. Noho izany, araka ny sequentially araka ny parameter:

  • "*.xml"- saron-tava ho karohina

  • 8 — id amin'ny fiteny ampiharana ny fitsipika

  • "cleartextTrafficPermitted"- anarana anarana amin'ny xml

  • "true" - ny sandan'io toetra io

  • false - fampiasana fomba fiteny mahazatra rehefa mikaroka

  • true - midika fa ny fikarohana dia hatao tsy miraharaha tranga, izany hoe, case-sensitive

Ohatra, nampiasa fitsipika iray izahay izay mamaritra ny tsy mety, amin'ny lafiny fiarovana, ny firafitry ny fifandraisana amin'ny tambajotra amin'ny Android izay mamela ny fifandraisana amin'ny mpizara amin'ny alàlan'ny protocol HTTP. Ohatra momba ny toe-javatra misy toetra iray cleartextTrafficPermitted misy dikany 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>

Asa iray: Mametra ny valiny amin'ny anaran'ny rakitra/lalana

vahaolana: Ao amin'ny iray amin'ireo tetikasa lehibe mifandraika amin'ny fampivoarana fampiharana finday ho an'ny Android, dia nahita vokatra diso momba ny fitsipika izay mamaritra ny firafitry ny obfuscation izahay. Ny zava-misy dia ny fitsipika ivelan'ny boaty dia mikaroka ao amin'ny rakitra build.gradle sehatra iray tompon'andraikitra amin'ny fampiharana ny fitsipiky ny famotsorana ny fampiharana.

Saingy amin'ny tetikasa lehibe indraindray dia misy rakitra ankizy build.gradle, izay manondro ireo tranomboky tafiditra ao anatin'ilay tetikasa. Ny mampiavaka azy dia na dia tsy milaza aza ireo rakitra ireo fa ilaina ny fanakorontanana, dia hampiharina mandritra ny fanangonam-bokatra ny filaharan'ny fichier fivorian'ny ray aman-dreny.

Noho izany, ny asa dia ny manapaka triggers amin'ny ankizy antontan-taratasy izay an'ny trano famakiam-boky. Izy ireo dia azo fantarina amin'ny fisian'ny tsipika apply 'com.android.library'.

Ohatra code avy amin'ny rakitra build.gradle, izay mamaritra ny ilana ny fanakorontanana:

apply plugin: 'com.android.application'

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

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

dependencies {
  ...
}

Ohatra rakitra build.gradle ho an'ny tranomboky tafiditra ao amin'ny tetikasa izay tsy manana ity toe-javatra ity:

apply plugin: 'android-library'

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

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

Ary ny fitsipika ho an'ny 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);
		}
	}
}

Ity fomba fiasa ity dia mety ho an'ny rehetra ary mahasoa tsy ho an'ny rindranasa Android ihany, fa ho an'ny tranga hafa koa rehefa mila mamaritra raha misy rakitra manokana ny valiny.

Asa iray: Manampia fanohanana ho an'ny tranomboky an'ny antoko fahatelo raha tsy tohanana tanteraka ny fehezanteny

vahaolana: Ny isan'ny rafitra isan-karazany ampiasaina amin'ny dingan'ny fanoratana kaody dia tsy ao anaty tabilao fotsiny. Mazava ho azy fa tsy fantatry ny Checkmarx foana ny fisian'izy ireo, ary ny andraikitray dia ny mampianatra azy hahatakatra fa ny fomba sasany dia tafiditra manokana amin'ity rafitra ity. Indraindray dia sarotra izany noho ny zava-misy fa ny frameworks dia mampiasa anarana fiasa izay tena mahazatra ary tsy azo atao ny mamaritra mazava ny fifandraisan'ny antso manokana amin'ny tranomboky manokana.

Ny fahasarotana dia tsy fantatra tsara foana ny syntax an'ny tranomboky toy izany ary tsy maintsy manandrana ianao mba tsy hahazoana valiny diso. Misy safidy maromaro hanatsarana ny fahamarinan'ny scan sy hamaha ny olana:

  • Ny safidy voalohany, fantatsika tsara fa ny tranomboky dia ampiasaina amin'ny tetikasa manokana ary afaka mampihatra ny fitsipika eo amin'ny sehatry ny ekipa. Saingy raha manapa-kevitra ny hanao fomba hafa ny ekipa na mampiasa tranomboky maromaro izay mifanindry ny anaran'ny asa, dia afaka mahazo sary tsy dia mahafinaritra momba ny lafy tsaran-javatra maro.

  • Ny safidy faharoa dia ny mikaroka ireo rakitra izay nafarana mazava tsara ny tranomboky. Amin'ny alalan'io fomba fiasa io dia azontsika antoka fa ny tranomboky ilaintsika dia tena ampiasaina amin'ity rakitra ity.

  • Ary ny safidy fahatelo dia ny fampiasana ireo fomba roa etsy ambony miaraka.

Ohatra, andeha hojerentsika ny tranomboky iray malaza amin'ny faribolana tery malama ho an'ny fiteny fandaharana Scala, izany hoe ny fampiasa Fampitahana soatoavina ara-bakiteny. Amin'ny ankapobeny, mba handefasana parameter amin'ny fangatahana SQL dia tsy maintsy mampiasa ny operator ianao $, izay manolo ny angona ho fangatahana SQL efa nomanina. Izany hoe, raha ny marina, dia mifanandrify mivantana amin'ny fanambarana voaomana amin'ny Java. Saingy, raha mila manangana fangatahana SQL ianao, ohatra, raha mila mandefa anaran-databatra ianao dia azonao atao ny mampiasa ny operator. #$, izay hanolo mivantana ny angon-drakitra ho amin'ny fangatahana (saika mitovy amin'ny fampifangaroana kofehy).

Kaody santionany:

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

Tsy mbola hain'i Checkmarx ny fomba hamantarana ny fampiasana ny Soatoavina ara-bakiteny Splicing ary mandingana ireo mpandraharaha #$, ka andeha isika hampianatra azy hamantatra ny mety ho tsindrona SQL ary hanasongadinana ny toerana mety amin'ny kaody:

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

Asa iray: Mitadiava asa mora ampiasaina ao amin'ny tranomboky Open-Source

vahaolana: Orinasa maro no mampiasa fitaovana fanaraha-maso Open-Source (fampiharana OSA) hamantarana ny fampiasana ireo kinova famakiam-boky marefo amin'ny fampiharana novolavolaina. Indraindray dia tsy azo atao ny manavao ny tranomboky toy izany amin'ny dikan-teny azo antoka. Amin'ny tranga sasany dia misy fetra azo ampiasaina, amin'ny hafa dia tsy misy dikan-teny azo antoka mihitsy. Amin'ity tranga ity, ny fitambaran'ny fomba fanao SAST sy OSA dia hanampy amin'ny famaritana fa tsy ampiasaina amin'ny kaody ireo fiasa izay mitarika amin'ny fitrandrahana ny vulnerable.

Saingy indraindray, indrindra rehefa mandinika ny JavaScript, dia mety tsy asa tsy misy dikany tanteraka izany. Ity ambany ity ny vahaolana, angamba tsy mety, nefa miasa, mampiasa ny ohatra ny vulnerability ao amin'ny singa. lodash amin'ny fomba template и *set.

Ohatra amin'ny fitsapana kaody mety ho marefo amin'ny rakitra 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!'

Ary rehefa mifandray mivantana amin'ny 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>

Mitady ny fomba mora vulnerable rehetra izahay, izay voatanisa ao anatin'ny vulnerability:

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

Asa iray: Mikaroka ireo mari-pankasitrahana tafiditra ao anatin'ny fampiharana

vahaolana: Tsy mahazatra ny fampiharana, indrindra fa ny finday, mampiasa mari-pankasitrahana na fanalahidy hidirana amin'ny servisy isan-karazany na hanamarina SSL-Pinning. Amin'ny lafiny fiarovana, ny fitehirizana zavatra toy izany amin'ny kaody dia tsy fanao tsara indrindra. Andao hiezaka hanoratra fitsipika izay hikaroka rakitra mitovy amin'izany ao amin'ny tahiry:

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

Asa iray: Mitadiava mari-pamantarana marimaritra iraisana amin'ny fampiharana

vahaolana: Matetika dia ilaina ny manafoana ny famantarana marimaritra iraisana na fampahalalana manan-danja hafa izay hita ao amin'ny code. Mazava ho azy fa tsy hevitra tsara ny mitahiry azy ireo ao anatin'ny kaody loharano, fa miovaova ny toe-javatra. Noho ny fangatahana CxQL dia mora ny mahita zavatra toy izao:

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

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

famaranana

Manantena aho fa hahasoa ireo izay manomboka mahafantatra ny fitaovana Checkmarx ity lahatsoratra ity. Angamba ireo izay nanoratra ny fitsipiny manokana nandritra ny fotoana ela dia hahita zavatra ilaina amin'ity torolàlana ity.

Indrisy anefa fa misy amin'izao fotoana izao ny tsy fahampian'ny loharanom-baovao ahafahana mitsimpona hevitra vaovao mandritra ny famolavolana ny fitsipika ho an'ny Checkmarx. Izany no nahatonga anay namorona repository amin'ny Github, izay handefasanay ny asantsika mba hahitan'ny rehetra mampiasa CxQL zavatra mahasoa ao, ary hanana fahafahana hizara ny asany amin'ny fiarahamonina ihany koa. Eo am-pamenoana sy fandrafetana votoaty ny tahiry, ka raisina an-tanan-droa ny mpandray anjara!

Fidio ny Fiteninao

Source: www.habr.com

Add a comment