Yuav ua li cas sau cov cai rau Checkmarx tsis mus vwm

Hlo Habr!

Hauv peb txoj haujlwm, peb lub tuam txhab feem ntau cuam tshuam nrog ntau yam cuab yeej kev tshuaj ntsuam zoo li qub (SAST). Tawm ntawm lub thawv lawv txhua tus ua haujlwm nruab nrab. Tau kawg, txhua yam nyob ntawm qhov project thiab cov thev naus laus zis siv hauv nws, nrog rau qhov zoo npaum li cas cov thev naus laus zis tau them los ntawm cov cai tshuaj ntsuam. Hauv kuv lub tswv yim, ib qho tseem ceeb tshaj plaws thaum xaiv lub cuab yeej SAST yog lub peev xwm los kho nws rau qhov tshwj xeeb ntawm koj daim ntawv thov, uas yog, sau thiab hloov cov cai tswj xyuas lossis, raws li lawv feem ntau hu ua, Cov Lus Nug Txog Kev Cai.

Yuav ua li cas sau cov cai rau Checkmarx tsis mus vwm

Peb feem ntau siv Checkmarx - qhov zoo tshaj plaws thiab muaj zog code analyzer. Hauv tsab xov xwm no kuv yuav tham txog kuv qhov kev paub ntawm kev sau ntawv txheeb xyuas cov cai rau nws.

Cov txheej txheem

nkag

Pib nrog, Kuv xav pom zoo ib qho ntawm ob peb kab lus hauv Lavxias txog cov yam ntxwv ntawm kev sau cov lus nug rau Checkmarx. Nws tau luam tawm ntawm Habre thaum kawg ntawm 2019 raws li lub npe: "Nyob zoo, Checkmarx!" Yuav ua li cas sau Checkmarx SAST cov lus nug thiab pom qhov tsis zoo.

Nws tshuaj xyuas kom meej yuav ua li cas sau thawj cov lus nug hauv CxQL (Checkmarx Query Language) rau qee daim ntawv thov kev xeem thiab qhia cov ntsiab lus tseem ceeb ntawm kev txheeb xyuas cov cai ua haujlwm li cas.

Kuv yuav tsis rov hais dua qhov tau piav qhia hauv nws, txawm hais tias qee qhov kev sib tshuam tseem yuav tshwm sim. Hauv kuv tsab xov xwm kuv yuav sim sau ib hom "sau cov zaub mov txawv", ib daim ntawv teev cov kev daws teeb meem tshwj xeeb uas kuv tau ntsib thaum kuv ua haujlwm nrog Checkmarx. Kuv yuav tsum tau rack kuv lub hlwb hla ntau yam teeb meem no. Qee lub sij hawm tsis muaj cov ntaub ntawv txaus hauv cov ntaub ntawv, thiab qee zaum nws tseem nyuaj rau kev nkag siab tias yuav ua li cas thiaj li yuav tsum tau ua. Kuv vam tias kuv qhov kev paub dhau los thiab hmo tsis tsaug zog yuav tsis muaj qhov tsis muaj txiaj ntsig, thiab qhov "sau ntawm Cov Lus Nug Cov Khoom Noj" yuav cawm koj ob peb teev lossis ob peb lub paj hlwb. Yog li, cia peb pib!

Cov ntaub ntawv dav dav ntawm cov cai

Ua ntej, cia peb saib ob peb lub tswv yim thiab cov txheej txheem ntawm kev ua haujlwm nrog cov cai, kom nkag siab zoo txog qhov yuav tshwm sim tom ntej. Thiab tseem vim tias cov ntaub ntawv tsis hais dab tsi txog qhov no lossis nthuav tawm hauv cov qauv, uas tsis yooj yim heev.

  1. Cov kev cai raug siv thaum lub sij hawm scan nyob ntawm qhov preset xaiv thaum pib (ib txheej ntawm cov cai nquag). Koj tuaj yeem tsim tus naj npawb tsis txwv ntawm presets, thiab yuav ua li cas los txhim kho lawv nyob ntawm qhov tshwj xeeb ntawm koj cov txheej txheem. Koj tuaj yeem pab pawg los ntawm hom lus lossis xaiv presets rau txhua qhov project. Tus naj npawb ntawm cov kev cai nquag cuam tshuam rau qhov ceev thiab qhov tseeb ntawm kev tshuaj ntsuam.

    Yuav ua li cas sau cov cai rau Checkmarx tsis mus vwmTeeb tsa Preset hauv Checkmarx interface

  2. Cov kev cai raug kho nyob rau hauv ib lub cuab yeej tshwj xeeb hu ua CxAuditor. Qhov no yog daim ntawv thov desktop uas txuas rau lub server khiav Checkmarx. Cov cuab yeej no muaj ob hom kev ua haujlwm: kho cov cai thiab tshuaj xyuas cov txiaj ntsig ntawm kev ua tiav scan.

    Yuav ua li cas sau cov cai rau Checkmarx tsis mus vwmCxAudit interface

  3. Cov cai hauv Checkmarx muab faib los ntawm hom lus, uas yog, txhua hom lus muaj nws cov lus nug. Kuj tseem muaj qee qhov kev cai dav dav uas siv tsis hais hom lus, cov no yog cov lus nug yooj yim. Feem ntau, cov lus nug tseem ceeb suav nrog kev tshawb nrhiav cov ntaub ntawv uas lwm cov cai siv.

    Yuav ua li cas sau cov cai rau Checkmarx tsis mus vwmKev faib cov cai los ntawm hom lus

  4. Cov kev cai yog "Executable" thiab "Non-Executable" (Tswj thiab tsis ua). Tsis yog lub npe tiag tiag, hauv kuv lub tswv yim, tab sis qhov ntawd yog qhov nws yog. Cov kab hauv qab yog tias qhov tshwm sim ntawm kev ua tiav "Ua tiav" cov cai yuav tshwm sim hauv cov txiaj ntsig scan hauv UI, thiab "Tsis Ua Haujlwm" cov cai tsuas yog siv lawv cov txiaj ntsig hauv lwm qhov kev thov (hauv qhov tseem ceeb, tsuas yog ua haujlwm xwb).

    Yuav ua li cas sau cov cai rau Checkmarx tsis mus vwmKev txiav txim siab txoj cai hom thaum tsim

  5. Koj tuaj yeem tsim cov cai tshiab lossis ntxiv / rov sau cov uas twb muaj lawm. Txhawm rau rov sau ib txoj cai, koj yuav tsum nrhiav nws hauv tsob ntoo, txoj cai-nias thiab xaiv "Override" los ntawm cov ntawv qhia zaub mov. Nws yog ib qho tseem ceeb uas yuav tsum nco ntsoov ntawm no tias cov kev cai tshiab tsis yog thawj zaug suav nrog hauv presets thiab tsis ua haujlwm. Txhawm rau pib siv lawv koj yuav tsum qhib lawv hauv "Preset Manager" ntawv qhia zaub mov hauv qhov ntsuas. Rewritten cov cai khaws lawv cov chaw, uas yog, yog tias txoj cai tau ua haujlwm, nws yuav nyob twj ywm li ntawd thiab yuav siv tam sim ntawd.

    Yuav ua li cas sau cov cai rau Checkmarx tsis mus vwmPiv txwv ntawm txoj cai tshiab hauv Preset Manager interface

  6. Thaum ua tiav, "ntoo" ntawm kev thov yog tsim, uas nyob ntawm seb dab tsi. Cov kev cai uas sau cov ntaub ntawv raug tua ua ntej, thiab cov neeg siv thib ob. Cov txiaj ntsig kev ua tiav yog cached, yog li yog tias nws tuaj yeem siv cov txiaj ntsig ntawm txoj cai uas twb muaj lawm, nws yog qhov zoo dua los ua li ntawd, qhov no yuav txo lub sijhawm scanning.

  7. Cov cai tuaj yeem siv rau ntau qib:

  • Rau tag nrho cov kab ke - yuav raug siv rau kev soj ntsuam ntawm ib qhov project

  • Hauv pab pawg (Team) - tsuas yog siv los luam theej duab cov haujlwm hauv pab pawg xaiv.

  • Ntawm qhov project theem - Yuav siv rau hauv ib qhov project tshwj xeeb

    Yuav ua li cas sau cov cai rau Checkmarx tsis mus vwmKev txiav txim siab theem ntawm txoj cai yuav raug siv

"Dictionary" rau beginners

Thiab kuv yuav pib nrog ob peb yam uas ua rau kuv muaj lus nug, thiab kuv tseem yuav qhia ntau cov tswv yim uas yuav ua rau lub neej yooj yim dua.

Kev ua haujlwm nrog cov npe

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

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

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

Txhua yam khoom pom

Hauv cov lus scanned, koj tuaj yeem tau txais cov npe ntawm tag nrho cov ntsiab lus uas Checkmarx tau txheeb xyuas (cov hlua, kev ua haujlwm, chav kawm, txoj hauv kev, thiab lwm yam). Nov yog qee qhov chaw ntawm cov khoom uas tuaj yeem nkag tau los ntawm All. Ntawd yog, txhawm rau tshawb nrhiav ib yam khoom nrog lub npe tshwj xeeb searchMe, koj tuaj yeem tshawb nrhiav, piv txwv li, los ntawm lub npe hla txhua yam khoom pom:

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

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

Tab sis, yog tias koj xav tshawb hauv lwm hom lus uas vim qee yam tsis suav nrog hauv kev luam theej duab (piv txwv li, groovy hauv qhov project hauv Android), koj tuaj yeem nthuav peb qhov chaw khoom los ntawm qhov sib txawv:

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

Muaj nuj nqi rau Flow analysis

Cov haujlwm no tau siv ntau txoj cai thiab ntawm no yog ib daim ntawv qhia me ntsis ntawm lawv txhais li cas:

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

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

Tau txais cov ntaub ntawv npe / kab

Muaj ob peb yam khoom uas tuaj yeem tau txais los ntawm cov txiaj ntsig ntawm cov lus nug (lub npe ntawm cov ntaub ntawv uas tau pom, txoj hlua, thiab lwm yam), tab sis cov ntaub ntawv tsis tau hais tias yuav tau txais thiab siv li cas. Yog li, txhawm rau ua qhov no, koj yuav tsum nkag mus rau LinePragma cov cuab yeej thiab cov khoom peb xav tau yuav nyob hauv nws:

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

Nws tsim nyog nco ntsoov tias FileName muaj txoj hauv kev rau cov ntaub ntawv, txij li peb tau siv txoj kev GetFirstGraph.

Kev ua tiav

Muaj qhov sib txawv tshwj xeeb hauv CxQL result, uas xa rov qab cov txiaj ntsig ntawm kev ua tiav koj txoj cai sau tseg. Nws yog pib tam sim ntawd thiab koj tuaj yeem sau cov txiaj ntsig nruab nrab rau hauv nws, hloov thiab kho lawv thaum koj ua haujlwm. Tab sis, yog tias tsis muaj txoj haujlwm rau qhov hloov pauv no lossis ua haujlwm hauv txoj cai return- Cov txiaj ntsig ua tiav yuav ib txwm yog xoom.

Cov lus nug hauv qab no yuav tsis xa rov qab ib yam dab tsi rau peb raws li kev ua tiav thiab yuav ib txwm tsis muaj dab tsi:

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

Tab sis, tau muab cov txiaj ntsig ua tiav rau qhov txiaj ntsig zoo sib xws, peb yuav pom qhov kev hu no rov qab los rau peb:

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

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

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

Siv cov txiaj ntsig ntawm lwm txoj cai

Cov cai hauv Checkmarx tuaj yeem raug hu ua piv txwv rau kev ua haujlwm hauv cov lus programming tsis tu ncua. Thaum sau ib txoj cai, koj tuaj yeem siv cov txiaj ntsig ntawm lwm cov lus nug. Piv txwv li, tsis tas yuav tshawb nrhiav txhua txoj hauv kev hu rau hauv code txhua zaus, tsuas yog hu rau txoj cai xav tau:

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

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

Txoj hauv kev no tso cai rau koj kom luv cov cai thiab txo cov sijhawm ua tiav txoj cai.

Teeb meem daws teeb meem

Kev sau npe

Thaum ua haujlwm nrog lub cuab yeej, qee zaum nws tsis tuaj yeem sau cov lus nug uas xav tau tam sim ntawd thiab koj yuav tsum tau sim, sim cov kev xaiv sib txawv. Rau cov xwm txheej zoo li no, lub cuab yeej muab kev txiav, uas yog hu ua raws li hauv qab no:

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

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

Tab sis nws yog tsim nyog nco ntsoov tias txoj kev no tsuas yog txais raws li cov tswv yim txoj hlua, yog li nws yuav tsis tuaj yeem tso saib cov npe tag nrho ntawm cov khoom pom raws li kev ua haujlwm thawj zaug. Qhov kev xaiv thib ob, uas yog siv rau kev debugging, yog muab rau cov khawv koob hloov pauv ib ntus result qhov tshwm sim ntawm cov lus nug thiab pom dab tsi tshwm sim. Txoj hauv kev no tsis yooj yim heev; koj yuav tsum nco ntsoov tias tsis muaj overrides lossis ua haujlwm nrog qhov no hauv cov cai tom qab result los yog yooj yim hais cov cai hauv qab no. Lossis koj tuaj yeem, zoo li kuv, tsis nco qab tshem ntau qhov kev hu xovtooj los ntawm txoj cai npaj tau thiab xav tsis thoob vim li cas tsis ua haujlwm.

Ib txoj kev yooj yim dua yog hu rau txoj kev return nrog rau qhov xav tau parameter. Hauv qhov no, kev ua tiav ntawm txoj cai yuav xaus thiab peb tuaj yeem pom tias muaj dab tsi tshwm sim los ntawm qhov peb tau sau:

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

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

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

Login teeb meem

Muaj cov xwm txheej thaum koj tsis tuaj yeem nkag mus rau CxAudit cuab yeej (uas yog siv los sau cov cai). Nws tuaj yeem muaj ntau qhov laj thawj rau qhov no, suav nrog kev sib tsoo, kev hloov kho Windows tam sim ntawd, BSOD thiab lwm yam xwm txheej tsis tau pom dua uas dhau ntawm peb txoj kev tswj hwm. Hauv qhov no, qee zaum muaj kev sib tham tsis tiav hauv cov ntaub ntawv, uas txwv tsis pub koj nkag rau hauv dua. Txhawm rau txhim kho nws, koj yuav tsum khiav ntau cov lus nug:

Rau Checkmarx ua ntej 8.6:

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

Rau Checkmarx tom qab 8.6:

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

Kev sau ntawv

Tam sim no peb tau mus rau qhov nthuav tshaj plaws. Thaum koj pib sau cov cai hauv CxQL, qhov koj feem ntau tsis muaj tsis yog cov ntaub ntawv ntau npaum li qee qhov kev ua neej nyob ntawm kev daws qee yam teeb meem thiab piav qhia txog cov txheej txheem ntawm kev nug kev ua haujlwm feem ntau.

Kuv yuav sim ua kom lub neej yooj yim me ntsis rau cov neeg uas tab tom pib dhia rau hauv cov lus nug thiab muab ob peb yam piv txwv ntawm kev siv Cov Lus Nug Txog Kev Cai los daws cov teeb meem. Qee tus ntawm lawv yog qhov dav dav thiab tuaj yeem siv hauv koj lub tuam txhab xyaum tsis muaj kev hloov pauv, lwm tus yog qhov tshwj xeeb, tab sis lawv kuj tuaj yeem siv los ntawm kev hloov cov cai kom haum rau qhov tshwj xeeb ntawm koj daim ntawv thov.

Yog li, ntawm no yog cov teeb meem uas peb ntsib feem ntau:

Kev sib tw: Muaj ob peb Flows nyob rau hauv cov txiaj ntsig ntawm kev ua raws li txoj cai thiab ib qho ntawm lawv yog ib qho zes ntawm lwm tus, koj yuav tsum tso ib qho ntawm lawv.

tshuaj: Tseeb, qee zaum Checkmarx qhia ntau cov ntaub ntawv ntws uas yuav sib tshooj thiab ua luv luv ntawm lwm tus. Muaj ib txoj hauv kev tshwj xeeb rau cov xwm txheej zoo li no ReduceFlow. Nyob ntawm qhov parameter, nws yuav xaiv qhov luv tshaj lossis ntev tshaj Flow:

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

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

Kev sib tw: Nthuav cov npe ntawm cov ntaub ntawv rhiab uas lub cuab yeej ua haujlwm

tshuaj: Checkmarx muaj cov cai yooj yim, cov txiaj ntsig tau siv los ntawm ntau lwm cov lus nug. Los ntawm kev ntxiv qee cov cai no nrog cov ntaub ntawv tshwj xeeb rau koj daim ntawv thov, koj tuaj yeem txhim kho koj cov txiaj ntsig scan tam sim ntawd. Hauv qab no yog ib qho piv txwv txoj cai kom koj pib:

General_privacy_violation_list

Cia peb ntxiv ntau qhov sib txawv uas siv hauv peb daim ntawv thov los khaws cov ntaub ntawv rhiab:

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

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

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

Kev sib tw: Nthuav cov npe ntawm cov hloov pauv nrog cov passwords

tshuaj: Kuv xav kom tam sim ntawd them sai sai rau txoj cai yooj yim rau kev txhais cov passwords hauv code thiab ntxiv rau nws cov npe ntawm cov npe sib txawv uas feem ntau siv hauv koj lub tuam txhab.

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

Kev sib tw: Ntxiv cov qauv siv uas tsis tau txais kev txhawb nqa los ntawm Checkmarx

tshuaj: Tag nrho cov lus nug hauv Checkmarx tau muab faib ua hom lus, yog li koj yuav tsum tau ntxiv cov cai rau txhua hom lus. Hauv qab no yog qee qhov piv txwv ntawm cov kev cai zoo li no.

Yog tias cov tsev qiv ntawv tau siv qhov sib ntxiv lossis hloov cov qauv kev ua haujlwm, lawv tuaj yeem yooj yim ntxiv rau txoj cai yooj yim. Tom qab ntawd txhua tus neeg uas siv nws tam sim ntawd yuav kawm txog cov lus qhia tshiab. Ua piv txwv, cov tsev qiv ntawv rau kev nkag rau hauv Android yog Timber thiab Loggi. Hauv pob ntawv yooj yim, tsis muaj cov cai rau kev txheeb xyuas cov xov tooj uas tsis yog lub kaw lus, yog li yog tias tus password lossis tus cim kev sib tham nkag mus rau hauv lub cav, peb yuav tsis paub txog nws. Cia peb sim ntxiv cov ntsiab lus ntawm cov txheej txheem no rau cov cai Checkmarx.

Test code piv txwv uas siv lub tsev qiv ntawv Timber rau kev txiav:

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

Thiab ntawm no yog ib qho piv txwv ntawm kev thov rau Checkmarx, uas yuav tso cai rau koj ntxiv cov ntsiab lus ntawm kev hu xov tooj rau Timber txoj kev ua qhov chaw tawm rau cov ntaub ntawv los ntawm daim ntawv thov:

FindAndroidOutputs

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

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

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

Thiab koj tuaj yeem ntxiv rau txoj cai nyob sib ze, tab sis qhov no cuam tshuam ncaj qha rau kev nkag rau hauv Android:

FindAndroidLog_Outputs

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

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

Tsis tas li, yog tias cov ntawv thov Android siv WorkManager rau kev ua haujlwm asynchronous, nws yog ib lub tswv yim zoo los qhia Checkmarx txog qhov no los ntawm kev ntxiv ib txoj hauv kev kom tau txais cov ntaub ntawv los ntawm txoj haujlwm. getInputData:

FindAndroidRead

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

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

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

Kev sib tw: Tshawb nrhiav cov ntaub ntawv rhiab hauv plist rau iOS cov haujlwm

tshuaj: iOS feem ntau siv cov ntaub ntawv tshwj xeeb nrog rau .plist txuas ntxiv los khaws ntau yam sib txawv thiab muaj txiaj ntsig. Kev khaws cov passwords, tokens, cov yuam sij thiab lwm yam ntaub ntawv rhiab hauv cov ntaub ntawv no tsis pom zoo, vim lawv tuaj yeem muab rho tawm ntawm lub cuab yeej yam tsis muaj teeb meem.

Plist cov ntaub ntawv muaj cov yam ntxwv uas tsis pom tseeb rau qhov muag liab qab, tab sis tseem ceeb rau Checkmarx. Cia peb sau ib txoj cai uas yuav tshawb nrhiav cov ntaub ntawv uas peb xav tau thiab qhia peb yog tias passwords lossis tokens tau hais txog qhov twg.

Ib qho piv txwv ntawm cov ntaub ntawv no, uas muaj lub cim rau kev sib txuas lus nrog cov kev pabcuam 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>

Thiab ib txoj cai rau Checkmarx, uas muaj ob peb nuances uas yuav tsum tau coj mus rau hauv tus account thaum sau:

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

Kev sib tw: Nrhiav cov ntaub ntawv hauv XML

tshuaj: Checkmarx muaj cov haujlwm yooj yim heev rau kev ua haujlwm nrog XML thiab tshawb nrhiav qhov tseem ceeb, cim npe, tus cwj pwm thiab ntau dua. Tab sis, hmoov tsis, muaj qhov yuam kev hauv cov ntaub ntawv vim tsis yog ib qho piv txwv ua haujlwm. Txawm hais tias qhov tsis xws luag no tau raug tshem tawm hauv cov ntaub ntawv tshiab, ceev faj yog tias koj siv cov ntaub ntawv dhau los.

Nov yog ib qho piv txwv tsis raug los ntawm cov ntaub ntawv:

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

Raws li qhov tshwm sim ntawm qhov kev sim ua tiav, peb yuav tau txais qhov yuam kev ntawd All tsis muaj txoj kev zoo li no... Thiab qhov no yog qhov tseeb, txij li muaj qhov tshwj xeeb, cais qhov khoom siv rau kev ua haujlwm rau kev ua haujlwm nrog XML - cxXPath. Nov yog qhov lus nug kom raug zoo li nrhiav qhov chaw hauv Android uas tso cai rau kev siv HTTP tsheb:

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

Cia peb saib nws nyob rau hauv me ntsis ntxiv, txij li cov syntax rau tag nrho cov haujlwm zoo sib xws, tom qab koj tau pom ib qho, ces koj tsuas yog yuav tsum xaiv qhov koj xav tau. Yog li, ua raws li cov parameters:

  • "*.xml"- daim npog qhov ncauj ntawm cov ntaub ntawv yuav tsum tau tshawb

  • 8 - ID ntawm hom lus uas siv txoj cai

  • "cleartextTrafficPermitted"— attribute npe xml

  • "true" - tus nqi ntawm tus cwj pwm no

  • false - siv cov lus qhia tsis tu ncua thaum tshawb nrhiav

  • true - txhais tau hais tias qhov kev tshawb nrhiav yuav raug ua tsis quav ntsej cov ntaub ntawv, uas yog, qhov tsis txaus ntseeg

Raws li qhov piv txwv, peb siv txoj cai uas txheeb xyuas qhov tsis raug, los ntawm qhov kev nyab xeeb ntawm qhov pom, kev sib txuas hauv network hauv Android uas tso cai rau kev sib txuas lus nrog server ntawm HTTP raws tu qauv. Piv txwv ntawm qhov chaw uas muaj tus cwj pwm cleartextTrafficPermitted nrog lub ntsiab lus 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>

Kev sib tw: Txwv cov txiaj ntsig los ntawm cov ntaub ntawv npe / kab

tshuaj: Nyob rau hauv ib qho ntawm cov haujlwm loj ntsig txog kev txhim kho daim ntawv thov mobile rau Android, peb tau ntsib qhov tsis zoo ntawm txoj cai uas txiav txim siab qhov teeb meem obfuscation. Qhov tseeb yog tias txoj cai tawm ntawm lub thawv tshawb hauv cov ntaub ntawv build.gradle kev teeb tsa lub luag haujlwm rau kev siv obfuscation cov cai rau kev tso tawm version ntawm daim ntawv thov.

Tab sis nyob rau hauv tej yaam num loj tej zaum kuj muaj me nyuam cov ntaub ntawv build.gradle, uas xa mus rau cov tsev qiv ntawv suav nrog hauv qhov project. Qhov peculiarity yog tias txawm tias cov ntaub ntawv no tsis qhia qhov xav tau rau obfuscation, qhov chaw ntawm niam txiv cov ntaub ntawv sib dhos yuav raug siv thaum muab tso ua ke.

Yog li, lub luag haujlwm yog txiav tawm qhov tshwm sim hauv cov ntaub ntawv menyuam yaus uas yog cov tsev qiv ntawv. Lawv tuaj yeem raug txheeb xyuas los ntawm qhov muaj kab apply 'com.android.library'.

Piv txwv code los ntawm cov ntaub ntawv build.gradle, uas txiav txim siab qhov xav tau rau obfuscation:

apply plugin: 'com.android.application'

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

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

dependencies {
  ...
}

Piv txwv cov ntaub ntawv build.gradle rau lub tsev qiv ntawv suav nrog hauv qhov project uas tsis muaj qhov teeb tsa no:

apply plugin: 'android-library'

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

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

Thiab txoj cai rau Checkmarx:

ProGuardObfuscationTsis siv

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

Txoj hauv kev no tuaj yeem ua tau zoo thoob ntiaj teb thiab muaj txiaj ntsig tsis yog rau cov ntawv thov Android nkaus xwb, tab sis kuj rau lwm qhov xwm txheej thaum koj xav tau txiav txim siab seb qhov txiaj ntsig yog rau cov ntaub ntawv tshwj xeeb.

Kev sib tw: Ntxiv kev txhawb nqa rau lub tsev qiv ntawv thib peb yog tias cov syntax tsis txaus siab

tshuaj: Tus naj npawb ntawm ntau lub moj khaum uas siv rau hauv cov txheej txheem ntawm kev sau cov lej tsuas yog tawm ntawm kab kos. Tau kawg, Checkmarx tsis yog ib txwm paub txog lawv lub neej, thiab peb txoj haujlwm yog qhia nws kom nkag siab tias qee txoj hauv kev tshwj xeeb rau lub moj khaum no. Qee lub sij hawm qhov no nyuaj los ntawm qhov tseeb tias lub moj khaum siv cov npe ua haujlwm uas muaj ntau heev thiab nws tsis tuaj yeem txiav txim siab qhov kev sib raug zoo ntawm ib qho kev hu mus rau ib lub tsev qiv ntawv tshwj xeeb.

Qhov nyuaj yog tias cov syntax ntawm cov tsev qiv ntawv no tsis yog ib txwm lees paub kom raug thiab koj yuav tsum tau sim kom tsis txhob tau txais ntau qhov tsis zoo. Muaj ntau ntau txoj hauv kev los txhim kho kev txheeb xyuas qhov tseeb thiab daws qhov teeb meem:

  • Thawj qhov kev xaiv, peb paub tseeb tias lub tsev qiv ntawv siv rau hauv ib txoj haujlwm tshwj xeeb thiab tuaj yeem siv txoj cai ntawm pab pawg. Tab sis yog tias pab neeg txiav txim siab ua lwm txoj hauv kev los yog siv ntau lub tsev qiv ntawv uas cov npe ua haujlwm sib tshooj, peb tuaj yeem tau txais cov duab tsis zoo ntawm ntau qhov tsis zoo.

  • Qhov thib ob kev xaiv yog mus nrhiav cov ntaub ntawv uas lub tsev qiv ntawv yog kom meej meej mas. Nrog rau txoj hauv kev no, peb tuaj yeem paub tseeb tias lub tsev qiv ntawv peb xav tau yog siv raws nraim hauv cov ntaub ntawv no.

  • Thiab qhov kev xaiv thib peb yog siv ob txoj hauv kev saum toj no ua ke.

Ua piv txwv, cia peb saib lub tsev qiv ntawv uas paub zoo hauv cov voj voog nqaim nplua rau Scala programming lus, uas yog, lub functionality Splicing Literal Values. Feem ntau, kom dhau qhov tsis sib xws rau cov lus nug SQL, koj yuav tsum siv tus neeg teb xov tooj $, uas hloov cov ntaub ntawv rau hauv cov lus nug SQL preformed. Ntawd yog, qhov tseeb, nws yog ib qho ncaj qha analogue ntawm Npaj Nqe Lus hauv Java. Tab sis, yog tias koj xav tau dynamically tsim cov lus nug SQL, piv txwv li, yog tias koj xav tau cov npe ntawm cov lus, koj tuaj yeem siv tus neeg teb xov tooj. #$, uas yuav ncaj qha hloov cov ntaub ntawv rau hauv cov lus nug (yuav luag zoo li txoj hlua sib txuas).

Qauv code:

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

Checkmarx tseem tsis tau paub yuav ua li cas txhawm rau txheeb xyuas kev siv Splicing Literal Values ​​thiab hla cov tswv lag luam #$, yog li cia peb sim qhia nws txhawm rau txheeb xyuas qhov muaj peev xwm SQL txhaj tshuaj thiab hais txog qhov chaw zoo hauv cov cai:

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

Kev sib tw: Tshawb nrhiav cov haujlwm yooj yim siv hauv Open-Source cov tsev qiv ntawv

tshuaj: Ntau lub tuam txhab siv Open-Source saib xyuas cov cuab yeej (OSA xyaum) los kuaj xyuas kev siv cov ntaub ntawv tsis zoo ntawm cov tsev qiv ntawv hauv cov ntawv thov tsim. Qee lub sij hawm nws tsis tuaj yeem hloov kho cov tsev qiv ntawv zoo li no mus rau qhov ruaj ntseg version. Qee lub sij hawm muaj kev txwv kev ua haujlwm, hauv lwm tus tsis muaj kev nyab xeeb version txhua. Hauv qhov no, kev sib xyaw ua ke ntawm SAST thiab OSA cov kev coj ua yuav pab txiav txim siab tias cov haujlwm uas ua rau muaj kev cuam tshuam ntawm qhov tsis zoo yog tsis siv hauv cov cai.

Tab sis qee zaum, tshwj xeeb tshaj yog thaum xav txog JavaScript, qhov no yuav tsis yog qhov tsis tseem ceeb kiag li. Hauv qab no yog kev daws teeb meem, tej zaum tsis zoo tagnrho, tab sis txawm li cas los xij ua haujlwm, siv cov piv txwv ntawm qhov tsis zoo hauv cov khoom siv. lodash hauv txoj kev template и *set.

Piv txwv ntawm qhov kev xeem uas muaj feem cuam tshuam rau hauv cov ntaub ntawv 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!'

Thiab thaum txuas ncaj qha hauv 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>

Peb tab tom nrhiav rau tag nrho peb cov txheej txheem yooj yim, uas tau teev nyob rau hauv qhov tsis zoo:

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

Kev sib tw: Tshawb nrhiav cov ntawv pov thawj hauv daim ntawv thov

tshuaj: Nws tsis yog qhov tsis yooj yim rau cov ntawv thov, tshwj xeeb tshaj yog cov xov tooj ntawm tes, siv daim ntawv pov thawj lossis cov yuam sij nkag mus rau ntau lub servers lossis txheeb xyuas SSL-Pinning. Los ntawm kev pom kev ruaj ntseg, khaws cov khoom zoo li no hauv cov lej tsis yog qhov kev coj ua zoo tshaj plaws. Cia peb sim sau ib txoj cai uas yuav tshawb nrhiav cov ntaub ntawv zoo sib xws hauv qhov chaw khaws cia:

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

Kev sib tw: Nrhiav kev cuam tshuam tokens hauv daim ntawv thov

tshuaj: Nws yog feem ntau yuav tsum tau tshem tawm kev cuam tshuam tokens lossis lwm yam ntaub ntawv tseem ceeb uas muaj nyob hauv txoj cai. Tau kawg, khaws cia rau hauv qhov chaws tsis yog lub tswv yim zoo, tab sis cov xwm txheej sib txawv. Ua tsaug rau CxQL cov lus nug, nrhiav tej yam zoo li no yooj yim heev:

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

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

xaus

Kuv vam tias tsab xov xwm no yuav muaj txiaj ntsig zoo rau cov neeg uas tab tom pib paub nrog cov cuab yeej Checkmarx. Tej zaum cov neeg uas tau sau lawv tus kheej cov cai rau lub sijhawm ntev kuj yuav pom qee yam muaj txiaj ntsig hauv phau ntawv qhia no.

Hmoov tsis zoo, tam sim no muaj qhov tsis muaj peev txheej uas cov tswv yim tshiab tuaj yeem khaws tau thaum lub sijhawm txhim kho cov cai rau Checkmarx. Yog vim li cas peb thiaj tsim repository ntawm Github, qhov twg peb yuav tshaj tawm peb txoj haujlwm kom txhua tus neeg siv CxQL tuaj yeem pom qee yam muaj txiaj ntsig hauv nws, thiab tseem muaj sijhawm los qhia lawv txoj haujlwm rau zej zog. Lub chaw khaws cia yog nyob rau hauv tus txheej txheem ntawm kev sau thiab tsim cov ntsiab lus, yog li cov neeg koom nrog txais tos!

Ua tsaug rau koj txoj kev paub!

Tau qhov twg los: www.hab.com

Ntxiv ib saib