چريو ٿيڻ کان سواءِ چيڪ مارڪس لاءِ ضابطا ڪيئن لکجي

اي حبر!

اسان جي ڪم ۾، اسان جي ڪمپني اڪثر ڪري مختلف جامد ڪوڊ تجزياتي اوزار (SAST) سان تعلق رکي ٿي. دٻي کان ٻاهر اهي سڀ ڪم سراسري. يقينن، اهو سڀ ان منصوبي تي منحصر آهي ۽ ان ۾ استعمال ٿيل ٽيڪنالاجيون، انهي سان گڏ اهي ٽيڪنالاجيون ڪيتري حد تائين تجزيي جي ضابطن سان ڍڪيل آهن. منهنجي خيال ۾، SAST ٽول چونڊڻ وقت سڀ کان اهم معيار اهو آهي ته ان کي توهان جي ايپليڪيشنن جي خاصيتن مطابق ترتيب ڏيڻ جي صلاحيت، يعني تحليل جا ضابطا لکو ۽ تبديل ڪريو يا، جيئن انهن کي اڪثر سڏيو ويندو آهي، ڪسٽم سوال.

چريو ٿيڻ کان سواءِ چيڪ مارڪس لاءِ ضابطا ڪيئن لکجي

اسان اڪثر استعمال ڪندا آهيون Checkmarx - هڪ تمام دلچسپ ۽ طاقتور ڪوڊ تجزيه ڪندڙ. هن آرٽيڪل ۾ آئون ان لاءِ تجزيي جي ضابطن لکڻ جي منهنجي تجربي بابت ڳالهائيندس.

مضمونن جو جدول

جائز آهي

شروع ڪرڻ لاءِ، مان روسي ۾ ڪجھ مضمونن مان ھڪڙو تجويز ڪرڻ چاھيان ٿو چيڪ مارڪس لاءِ سوالن لکڻ جي خصوصيتن بابت. اهو عنوان هيٺ 2019 جي آخر ۾ Habré تي شايع ڪيو ويو: "هيلو، چيڪ مارڪ!" ڪيئن لکجي چيڪ مارڪس SAST سوال ۽ ڳولھيو سھڻو نقصان.

اهو تفصيل سان جانچي ٿو ته پهرين سوالن کي ڪيئن لکجي CxQL (Checkmarx Query Language) ۾ ڪجهه ٽيسٽ ايپليڪيشن لاءِ ۽ ڏيکاري ٿو بنيادي اصولن جي تجزيي جا ضابطا ڪيئن ڪم ڪن ٿا.

ان ۾ جيڪو بيان ڪيو ويو آهي، ان کي مان ورجائي نهندس، البت ڪجهه چونڪ اڃا به موجود هوندا. منهنجي آرٽيڪل ۾ مان ڪوشش ڪندس ته هڪ قسم جي "ترڪيبون جو مجموعو"، خاص مسئلن جي حل جي هڪ فهرست جيڪا مون کي چيڪ مارڪس سان منهنجي ڪم دوران سامهون آئي. مون کي انهن ڪيترن ئي مسئلن تي منهنجي دماغ کي ريڪ ڪرڻو پيو. ڪڏهن ڪڏهن دستاويزن ۾ ڪافي معلومات نه هوندي هئي، ۽ ڪڏهن ڪڏهن اهو سمجهڻ ڏکيو هوندو هو ته ڪيئن ڪجي. مون کي اميد آهي ته منهنجو تجربو ۽ بي نياز راتيون بيڪار نه ٿينديون، ۽ هي ”ڪسٽم سوالن جي ترڪيب جو مجموعو“ توهان کي ڪجهه ڪلاڪ يا ڪجهه اعصابي سيلز بچائيندو. سو، اچو ته شروع ڪريون!

ضابطن تي عام معلومات

پهرين، اچو ته ڪجهه بنيادي تصورن ۽ ضابطن سان ڪم ڪرڻ جي عمل تي نظر وجهون، بهتر سمجهڻ لاءِ ته اڳتي ڇا ٿيندو. ۽ اهو پڻ ڇاڪاڻ ته دستاويز هن بابت ڪجهه به نه چوندا آهن يا ساخت ۾ تمام گهڻو پکڙيل آهي، جيڪو تمام آسان ناهي.

  1. ضابطا اسڪيننگ دوران لاڳو ٿين ٿا، ان جي بنياد تي شروع ۾ چونڊيل اڳواٽ (فعال ضابطن جو هڪ سيٽ). توھان ٺاھي سگھوٿا لامحدود تعداد ۾ اڳوڻن جو، ۽ بلڪل انھن کي ڪيئن ٺاھڻ جو دارومدار توھان جي عمل جي خصوصيتن تي آھي. توھان انھن کي ٻولي جي لحاظ کان گروپ ڪري سگھو ٿا يا ھر پروجيڪٽ لاءِ اڳواٽ چونڊي سگھو ٿا. فعال ضابطن جو تعداد اسڪيننگ جي رفتار ۽ درستگي کي متاثر ڪري ٿو.

    چريو ٿيڻ کان سواءِ چيڪ مارڪس لاءِ ضابطا ڪيئن لکجيچيڪ مارڪ انٽرفيس ۾ اڳواٽ سيٽ اپ ڪريو

  2. ضابطا هڪ خاص اوزار ۾ تبديل ڪيا ويا آهن CxAuditor. هي هڪ ڊيسڪ ٽاپ ايپليڪيشن آهي جيڪا چيڪ مارڪس هلائيندڙ سرور سان ڳنڍي ٿي. ھن اوزار ۾ آپريشن جا ٻه طريقا آھن: ضابطن کي تبديل ڪرڻ ۽ اڳ ۾ ئي ڪيل اسڪين جي نتيجن جو تجزيو ڪرڻ.

    چريو ٿيڻ کان سواءِ چيڪ مارڪس لاءِ ضابطا ڪيئن لکجيCxAudit انٽرفيس

  3. چيڪ مارڪس ۾ ضابطن کي ٻوليءَ جي لحاظ کان ورهايو ويو آهي، يعني هر ٻوليءَ جا پنهنجا پنهنجا سوال آهن. ڪجھ عام قاعدا پڻ آھن جيڪي لاڳو ٿين ٿا بغير ٻوليءَ جي، اھي آھن نام نهاد بنيادي سوال. سڀ کان وڌيڪ حصو لاء، بنيادي سوالن ۾ معلومات جي ڳولا شامل آهي جيڪي ٻيا ضابطا استعمال ڪن ٿا.

    چريو ٿيڻ کان سواءِ چيڪ مارڪس لاءِ ضابطا ڪيئن لکجيضابطن کي ٻوليءَ سان ورهائڻ

  4. ضابطا آهن "Executable" ۽ "Non-Executable" (Executed and Not Executed). بلڪل صحيح نالو ناهي، منهنجي خيال ۾، پر اهو ئي آهي. هيٺئين لڪير اهو آهي ته "Executable" ضابطن تي عمل ڪرڻ جو نتيجو UI ۾ اسڪين نتيجن ۾ ڏيکاريو ويندو، ۽ "غير قابل عمل" ضابطن جي ضرورت آهي صرف انهن جي نتيجن کي ٻين درخواستن ۾ استعمال ڪرڻ لاء (جوهر ۾، صرف هڪ فنڪشن).

    چريو ٿيڻ کان سواءِ چيڪ مارڪس لاءِ ضابطا ڪيئن لکجيٺاھڻ وقت ضابطي جي قسم جو تعين ڪرڻ

  5. توهان نوان ضابطا ٺاهي سگهو ٿا يا موجوده ضابطن کي مڪمل ڪري / ٻيهر لکي سگهو ٿا. قاعدي کي ٻيهر لکڻ لاءِ، توھان کي ان کي وڻ ۾ ڳولڻو پوندو، ساڄي ڪلڪ ڪريو ۽ ڊراپ-ڊائون مينيو مان "اوور رائڊ" چونڊيو. هتي اهو ياد رکڻ ضروري آهي ته نوان ضابطا شروعاتي طور تي اڳوڻن ۾ شامل نه آهن ۽ نه ئي فعال آهن. انھن کي استعمال ڪرڻ شروع ڪرڻ لاءِ توھان کي انھن کي چالو ڪرڻو پوندو ”پري سيٽ مئنيجر“ مينيو ۾. ٻيهر لکيل ضابطا انهن جي سيٽنگون برقرار رکندا آهن، اهو آهي، جيڪڏهن ضابطو فعال هو، اهو ئي رهندو ۽ فوري طور تي لاڳو ڪيو ويندو.

    چريو ٿيڻ کان سواءِ چيڪ مارڪس لاءِ ضابطا ڪيئن لکجياڳوڻي مئنيجر انٽرفيس ۾ نئين قاعدي جو مثال

  6. عمل جي دوران، درخواستن جو هڪ "وڻ" تعمير ڪيو ويو آهي، جنهن تي منحصر آهي. ضابطا جيڪي معلومات گڏ ڪن ٿا انهن تي عمل ڪيو وڃي ٿو پهرين، ۽ جيڪي استعمال ڪن ٿا اهي ٻئي. عملدرآمد جو نتيجو ڪيش ٿيل آهي، تنهن ڪري جيڪڏهن اهو ممڪن آهي ته موجوده قاعدي جي نتيجن کي استعمال ڪرڻ، پوء اهو ڪرڻ بهتر آهي، اهو اسڪيننگ جو وقت گهٽائيندو.

  7. ضابطا مختلف سطحن تي لاڳو ٿي سگهن ٿا:

  • سڄي سسٽم لاء - ڪنهن به منصوبي جي اسڪيننگ لاء استعمال ڪيو ويندو

  • ٽيم جي سطح تي (ٽيم) - صرف چونڊيل ٽيم ۾ منصوبن کي اسڪين ڪرڻ لاء استعمال ڪيو ويندو.

  • منصوبي جي سطح تي - هڪ مخصوص منصوبي ۾ لاڳو ڪيو ويندو

    چريو ٿيڻ کان سواءِ چيڪ مارڪس لاءِ ضابطا ڪيئن لکجيسطح جو تعين ڪرڻ جنهن تي ضابطو لاڳو ڪيو ويندو

"لغت" beginners لاء

۽ مان ڪجھ شين سان شروع ڪندس جيڪي مون لاءِ سوالن جو سبب بڻجن ٿيون، ۽ مان ڪجھ ٽيڪنڪ پڻ ڏيکاريندس جيڪي زندگيءَ کي آسان بڻائي سگھن ٿيون.

فهرستن سان گڏ آپريشن

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

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

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

سڀ مليا شيون

اسڪين ٿيل ٻوليءَ ۾، توھان حاصل ڪري سگھوٿا بلڪل انھن سڀني عنصرن جي لسٽ جن کي چيڪ مارڪس سڃاڻي چڪو آھي (اسٽرنگ، فنڪشن، ڪلاس، طريقا، وغيره). هي شيون جي ڪجهه جاء آهي جنهن جي ذريعي رسائي سگهجي ٿو All. اهو آهي، هڪ خاص نالي سان هڪ اعتراض ڳولڻ لاء searchMe، توهان ڳولي سگهو ٿا، مثال طور، سڀني مليل شين جي نالي سان:

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

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

پر، جيڪڏھن توھان کي ڪنھن ٻي ٻوليءَ ۾ ڳولھڻ جي ضرورت آھي جيڪا ڪنھن سبب جي ڪري اسڪين ۾ شامل نه ڪئي وئي ھئي (مثال طور، ھڪ Android پروجيڪٽ ۾ groovy)، توھان وڌائي سگھوٿا اسان جي اعتراض واري جاءِ کي متغير ذريعي:

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

فلو تجزيو لاءِ ڪم

اهي فنڪشن ڪيترن ئي ضابطن ۾ استعمال ڪيا ويا آهن ۽ هتي هڪ ننڍڙي چيٽ شيٽ آهي انهن جو مطلب ڇا آهي:

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

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

فائل جو نالو / رستو حاصل ڪرڻ

اتي ڪيتريون ئي خاصيتون آھن جيڪي حاصل ڪري سگھجن ٿيون ھڪڙي سوال جي نتيجن مان (فائل جو نالو جنھن ۾ داخلا مليل ھئي، اسٽرنگ، وغيره)، پر دستاويزن ۾ اھو نه آھي ته انھن کي ڪيئن حاصل ڪجي ۽ استعمال ڪجي. تنهن ڪري، هن کي ڪرڻ لاء، توهان کي رسائي جي ضرورت آهي LinePragma ملڪيت ۽ اسان کي گهربل شيون ان جي اندر واقع هونديون:

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

اهو ذهن ۾ رکڻ جي قابل آهي FileName اصل ۾ فائل جو رستو شامل آهي، ڇاڪاڻ ته اسان طريقو استعمال ڪيو آهي GetFirstGraph.

عمل جو نتيجو

CxQL اندر هڪ خاص متغير آهي result، جيڪو توهان جي لکيل قاعدي تي عمل ڪرڻ جو نتيجو ڏئي ٿو. اهو فوري طور تي شروع ڪيو ويو آهي ۽ توهان ان ۾ وچولي نتيجا لکي سگهو ٿا، انهن کي تبديل ڪرڻ ۽ بهتر ڪرڻ جيئن توهان ڪم ڪيو. پر، جيڪڏهن قاعدي جي اندر هن متغير يا فنڪشن جي ڪا به تفويض نه آهي return- عملدرآمد جو نتيجو هميشه صفر هوندو.

هيٺ ڏنل سوال عمل جي نتيجي ۾ اسان کي ڪجھ به واپس نه ڏيندو ۽ هميشه خالي هوندو:

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

پر، تعين ڪرڻ جي نتيجي کي جادو متغير جي نتيجي ۾، اسان ڏسندا سين ته هي ڪال اسان ڏانهن موٽائي ٿو:

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

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

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

ٻين ضابطن جي نتيجن کي استعمال ڪندي

چيڪ مارڪس ۾ ضابطن کي عام پروگرامنگ ٻوليءَ ۾ ڪمن جي برابر چئي سگهجي ٿو. جڏهن هڪ قاعدو لکڻ، توهان شايد ٻين سوالن جا نتيجا استعمال ڪري سگهو ٿا. مثال طور، هر وقت ڪوڊ ۾ سڀني طريقن جي ڪالن کي ڳولڻ جي ڪا ضرورت ناهي، صرف گهربل قاعدي کي ڪال ڪريو:

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

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

اهو طريقو توهان کي ڪوڊ کي مختصر ڪرڻ جي اجازت ڏئي ٿو ۽ ضابطي جي عمل جي وقت کي خاص طور تي گھٽائي ٿو.

مسئلن جو حل

لاگنگ

جڏهن اوزار سان ڪم ڪندي، ڪڏهن ڪڏهن اهو ممڪن ناهي ته فوري طور تي گهربل سوال لکڻ ۽ توهان کي تجربو ڪرڻو پوندو، مختلف اختيارن جي ڪوشش ڪندي. اهڙي صورت ۾، اوزار لاگنگ مهيا ڪري ٿو، جنهن کي هن ريت سڏيو ويندو آهي:

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

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

پر اهو ياد رکڻ جي قابل آهي ته هي طريقو صرف ان پٽ طور قبول ڪري ٿو تار، تنهنڪري اهو ممڪن نه ٿيندو ته پهرين آپريشن جي نتيجي ۾ مليل عناصر جي مڪمل فهرست ڏيکاري. ٻيو آپشن، جيڪو ڊيبگنگ لاءِ استعمال ڪيو ويندو آهي، وقت بوقت جادو جي متغير کي تفويض ڪرڻ آهي. result سوال جو نتيجو ۽ ڏسو ته ڇا ٿئي. اهو طريقو تمام آسان ناهي؛ توهان کي پڪ ڪرڻ جي ضرورت آهي ته ڪوڊ ۾ هن سان ڪو به اوور رائيڊ يا آپريشن ناهي result يا صرف هيٺ ڏنل ڪوڊ جو تبصرو ڪريو. يا توهان ڪري سگهو ٿا، مون وانگر، ڪيترن ئي اهڙين ڪالن کي هڪ تيار ڪيل قاعدي مان هٽائڻ کي وساريو ۽ حيران ٿي ته ڪجهه به ڪم ڇو نه ڪندو آهي.

هڪ وڌيڪ آسان طريقو آهي سڏڻ جو طريقو return گهربل پيٽرولر سان. ان صورت ۾، قاعدي جو عمل ختم ٿي ويندو ۽ اسان اهو ڏسي سگهنداسين ته ڇا ٿيو ان جي نتيجي ۾ جيڪو اسان لکيو آهي:

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

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

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

لاگ ان مسئلو

حالتون آهن جڏهن توهان رسائي نٿا ڪري سگهو CxAudit اوزار (جيڪو ضابطن کي لکڻ لاءِ استعمال ڪيو ويندو آهي). ان جا ڪيترائي سبب ٿي سگھن ٿا، جن ۾ حادثا، اوچتو ونڊوز اپڊيٽس، BSOD ۽ ٻيون غير متوقع حالتون شامل آھن جيڪي اسان جي ڪنٽرول کان ٻاھر آھن. انهي حالت ۾، ڪڏهن ڪڏهن ڊيٽابيس ۾ هڪ نامڪمل سيشن آهي، جيڪو توهان کي ٻيهر لاگ ان ٿيڻ کان روڪي ٿو. ان کي درست ڪرڻ لاء، توهان کي ڪيترن ئي سوالن کي هلائڻ جي ضرورت آهي:

چيڪ مارڪس لاءِ 8.6 کان اڳ:

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

چيڪ مارڪس لاءِ 8.6 کان پوءِ:

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

لکڻ جا ضابطا

هاڻي اسان سڀ کان دلچسپ حصو ڏانهن وڃو. جڏهن توهان CxQL ۾ قاعدا لکڻ شروع ڪندا آهيو، ته توهان وٽ اڪثر دستاويزن جي کوٽ نه هوندي آهي، جيتري قدر ڪجهه مسئلن کي حل ڪرڻ جا ڪجهه زنده مثال ۽ عام طور تي سوال جي آپريشن جي عمل کي بيان ڪرڻ.

مان ڪوشش ڪندس ته زندگي کي ٿورو آسان بڻائي انهن لاءِ جيڪي سوالن جي ٻولي ۾ ٻڏڻ شروع ڪري رهيا آهن ۽ ڪجهه مسئلا حل ڪرڻ لاءِ ڪسٽم سوالن کي استعمال ڪرڻ جا ڪيترائي مثال ڏيندس. انهن مان ڪجهه بلڪل عام آهن ۽ توهان جي ڪمپني ۾ عملي طور تي بغير تبديلين جي استعمال ڪري سگهجي ٿي، ٻيا وڌيڪ مخصوص آهن، پر اهي پڻ استعمال ڪري سگھجن ٿيون ڪوڊ کي تبديل ڪندي توهان جي ايپليڪيشنن جي خاصيتن جي مطابق.

تنهن ڪري، هتي اهي مسئلا آهن جيڪي اسان اڪثر ڪري رهيا آهيون:

ٽاسڪ قاعدي تي عمل ڪرڻ جي نتيجن ۾ ڪيترائي وهڪريون آهن ۽ انهن مان هڪ ٻئي جي نستي آهي، توهان کي انهن مان هڪ ڇڏڻ گهرجي.

حل: درحقيقت، ڪڏهن ڪڏهن Checkmarx ڏيکاري ٿو ڪيترن ئي ڊيٽا جي وهڪري جيڪا اوورليپ ٿي سگهي ٿي ۽ ٻين جو مختصر نسخو ٿي سگهي ٿو. اهڙين حالتن لاء هڪ خاص طريقو آهي گهٽايو فلو. پيٽرول تي مدار رکندي، اهو سڀ کان ننڍو يا ڊگهو وهڪرو چونڊيندو:

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

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

ٽاسڪ حساس ڊيٽا جي فهرست کي وڌايو جنهن تي اوزار رد عمل ڪري ٿو

حل: چيڪ مارڪس جا بنيادي قاعدا آھن، جن جا نتيجا ٻين ڪيترن ئي سوالن ۾ استعمال ٿيندا آھن. توھان جي ايپليڪيشن لاءِ مخصوص ڊيٽا سان انھن ضابطن مان ڪجھ کي پورو ڪرڻ سان، توھان فوري طور تي پنھنجي اسڪين جا نتيجا بھتر ڪري سگھو ٿا. توھان کي شروع ڪرڻ لاءِ ھيٺ ڏنل ھڪڙو مثال اصول آھي:

جنرل_پرائيويسي_وائيليشن_لسٽ

اچو ته شامل ڪريون ڪيترائي متغير جيڪي اسان جي ايپليڪيشن ۾ استعمال ڪيا ويا آهن حساس معلومات کي ذخيرو ڪرڻ لاءِ:

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

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

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

ٽاسڪ پاسورڊ سان متغيرن جي لسٽ کي وڌايو

حل: مان سفارش ڪندس ته فوري طور تي بنيادي قاعدي تي ڌيان ڏيو ڪوڊ ۾ پاسورڊ جي وضاحت ڪرڻ ۽ ان ۾ شامل ڪرڻ لاءِ متغير نالن جي فهرست جيڪي عام طور تي توهان جي ڪمپني ۾ استعمال ڪيا ويندا آهن.

پاسورڊ_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);
	}
}

ٽاسڪ استعمال ٿيل فريم ورڪ شامل ڪريو جيڪي چيڪ مارڪس پاران سپورٽ نه آھن

حل: Checkmarx ۾ سڀ سوالن کي ٻولي جي لحاظ کان ورهايو ويو آهي، تنهنڪري توهان کي هر ٻوليءَ لاءِ ضابطا شامل ڪرڻ گهرجن. هيٺ اهڙن قاعدن جا ڪجهه مثال آهن.

جيڪڏهن لائبريريون استعمال ڪيون وڃن ٿيون جيڪي معياري ڪارڪردگيءَ کي پورو ڪن ٿيون يا تبديل ڪن ٿيون، انهن کي آسانيءَ سان بنيادي قاعدي ۾ شامل ڪري سگهجي ٿو. پوءِ هرڪو جيڪو ان کي استعمال ڪري ٿو فوري طور تي نئين تعارف جي باري ۾ سکندو. مثال طور، Android ۾ لاگ ان ڪرڻ لاء لائبريريون ٽمبر ۽ Loggi آهن. بنيادي پيڪيج ۾، غير سسٽم ڪالن جي سڃاڻپ لاء ڪو به ضابطو نه آهي، تنهنڪري جيڪڏهن پاسورڊ يا سيشن جي سڃاڻپ ڪندڙ لاگ ان ۾ اچي ٿي، اسان ان بابت نه ڄاڻندا سين. اچو ته چيڪ مارڪس جي ضابطن ۾ اهڙن طريقن جي وصفن کي شامل ڪرڻ جي ڪوشش ڪريون.

ٽيسٽ ڪوڊ جو مثال جيڪو استعمال ڪري ٿو ٽمبر لائبريري لاگنگ لاءِ:

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

۽ هتي چيڪ مارڪس لاءِ درخواست جو هڪ مثال آهي، جيڪو توهان کي ٽمبر طريقن کي ڪال ڪرڻ جي هڪ تعريف شامل ڪرڻ جي اجازت ڏيندو جيئن ايپليڪيشن مان ڊيٽا لاءِ نڪرڻ واري نقطي:

ڳوليوAndroidOutputs

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

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

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

۽ توهان پاڙيسري قاعدي ۾ پڻ شامل ڪري سگهو ٿا، پر اهو هڪ سڌو سنئون Android ۾ لاگ ان ڪرڻ سان لاڳاپيل آهي:

FindAndroidLog_Outputs

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

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

انهي سان گڏ، جيڪڏهن Android ايپليڪيشنون استعمال ڪن ٿيون ڪم مئنيجر هم وقت سازي ڪم لاءِ، اهو هڪ سٺو خيال آهي ته ان بابت چيڪ مارڪس کي اضافي طور تي آگاهي ڏيڻ جو طريقو شامل ڪندي ڪم مان ڊيٽا حاصل ڪرڻ لاءِ getInputData:

FindAndroidRead

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

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

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

ٽاسڪ iOS منصوبن لاءِ plist ۾ حساس ڊيٽا جي ڳولا

حل: iOS اڪثر ڪري خاص فائلون استعمال ڪندو آهي .plist ايڪسٽينشن سان مختلف متغيرن ۽ قدرن کي ذخيرو ڪرڻ لاءِ. انهن فائلن ۾ پاسورڊ، ٽوڪن، ڪيچ ۽ ٻيون حساس ڊيٽا محفوظ ڪرڻ جي سفارش نه ڪئي وئي آهي، ڇاڪاڻ ته اهي بغير ڪنهن پريشاني جي ڊوائيس مان ڪڍي سگهجن ٿيون.

Plist فائلون خاصيتون آهن جيڪي ننگي اک ڏانهن واضح نه آهن، پر چيڪ مارڪ لاء اهم آهن. اچو ته هڪ قاعدو لکون جيڪو اسان کي گهربل ڊيٽا جي ڳولا ڪندو ۽ اسان کي ٻڌائي ته پاس ورڊ يا ٽوڪن جو ڪٿي ذڪر ڪيو ويو آهي.

اهڙي فائل جو هڪ مثال، جنهن ۾ بيڪ اينڊ سروس سان رابطي لاءِ هڪ ٽوڪن شامل آهي:

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

۽ چيڪ مارڪس لاءِ هڪ قاعدو، جنهن ۾ ڪيترائي نزاڪت آهن، جن کي لکڻ وقت ڌيان ۾ رکڻ گهرجي:

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

ٽاسڪ XML ۾ معلومات ڳولڻ

حل: چيڪ مارڪ XML سان ڪم ڪرڻ ۽ قدر، ٽيگ، خاصيتون ۽ وڌيڪ ڳولڻ لاء تمام آسان ڪم آهي. پر، بدقسمتي سان، دستاويز ۾ هڪ غلطي هئي، جنهن جي ڪري هڪ مثال ڪم نه ڪيو. ان حقيقت جي باوجود ته هن عيب کي دستاويز جي جديد ورزن ۾ ختم ڪيو ويو آهي، محتاط رهو جيڪڏهن توهان دستاويزن جي اڳوڻي نسخن کي استعمال ڪندا آهيو.

هتي دستاويز مان هڪ غلط مثال آهي:

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

عمل جي ڪوشش جي نتيجي ۾، اسان کي هڪ غلطي ملي ويندي All اهڙو ڪو به طريقو ناهي... ۽ اهو سچ آهي، ڇو ته هتي هڪ خاص، الڳ اعتراض جي جاءِ هوندي آهي ڪم ڪرڻ لاءِ ڪم ڪرڻ لاءِ XML - cxXPath. اھو اھو آھي جيڪو صحيح سوال ڏسڻ ۾ اچي ٿو Android ۾ ھڪڙي سيٽنگ ڳولڻ لاء جيڪا HTTP ٽرئفڪ جي استعمال جي اجازت ڏئي ٿي:

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

اچو ته ان کي ٿورو وڌيڪ تفصيل سان ڏسو، ڇاڪاڻ ته سڀني ڪمن لاء نحو هڪجهڙائي آهي، توهان کي هڪ سمجهڻ کان پوء، توهان کي صرف هڪ چونڊڻ جي ضرورت آهي جيڪا توهان کي گهربل آهي. تنهن ڪري، ترتيب وار پيراگراف جي مطابق:

  • "*.xml"- فائلن جو ماسڪ ڳولڻ لاء

  • 8 - ٻولي جي سڃاڻپ جنهن لاءِ قاعدو لاڳو ڪيو ويو آهي

  • "cleartextTrafficPermitted"xml ۾ وصف جو نالو

  • "true" - هن خاصيت جي قيمت

  • false - ڳولا دوران باقاعده اظهار جو استعمال

  • true - مطلب ته ڳولا ڪئي ويندي ڪيس کي نظر انداز ڪندي، يعني ڪيس غير حساس

مثال طور، اسان هڪ قاعدو استعمال ڪيو جيڪو غلط جي سڃاڻپ ڪري ٿو، سيڪيورٽي نقطي نظر کان، Android ۾ نيٽ ورڪ ڪنيڪشن سيٽنگون جيڪي HTTP پروٽوڪول ذريعي سرور سان رابطي جي اجازت ڏين ٿيون. ھڪڙي سيٽنگ جو مثال ھڪڙي خاصيت تي مشتمل آھي cleartextTrafficPermitted معنيٰ سان 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>

ٽاسڪ نتيجن کي محدود ڪريو فائل جو نالو / رستو

حل: Android لاءِ موبائيل ايپليڪيشن جي ترقي سان لاڳاپيل وڏي منصوبن مان هڪ ۾، اسان کي ضابطي جي غلط مثبتن سان منهن ڏيڻو پيو جيڪو تعين ڪري ٿو اوچتو سيٽنگ. حقيقت اها آهي ته باڪس مان ٻاهر جو قاعدو فائل ۾ ڳولي ٿو build.gradle ايپليڪيشن جي رليز ورزن لاءِ مبهم ضابطن کي لاڳو ڪرڻ لاءِ ذميوار سيٽنگ.

پر وڏن منصوبن ۾ ڪڏهن ڪڏهن ٻار فائلون آهن build.gradle، جيڪي پروجيڪٽ ۾ شامل لائبريرين جو حوالو ڏين ٿا. خصوصيت اها آهي ته جيتوڻيڪ اهي فائلون اوچتو جي ضرورت کي ظاهر نه ڪندا آهن، والدين اسيمبليء جي فائل جي سيٽنگن کي ترتيب ڏيڻ دوران لاڳو ڪيو ويندو.

ان ڪري، ڪم ٻارن جي فائلن ۾ ٽرڪن کي ختم ڪرڻ آهي جيڪي لائبريرين سان تعلق رکن ٿيون. انهن کي لڪير جي موجودگي سان سڃاڻي سگهجي ٿو apply 'com.android.library'.

فائل مان مثال ڪوڊ build.gradle، جيڪو تعين ڪرڻ جي ضرورت کي طئي ڪري ٿو:

apply plugin: 'com.android.application'

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

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

dependencies {
  ...
}

فائل جو مثال build.gradle پروجيڪٽ ۾ شامل لائبريري لاءِ جنهن ۾ هي سيٽنگ نه آهي:

apply plugin: 'android-library'

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

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

۽ چيڪ مارڪس لاءِ قاعدو:

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

اهو طريقو ڪافي عالمگير ۽ مفيد ٿي سگهي ٿو نه رڳو Android ايپليڪيشنن لاء، پر ٻين ڪيسن لاء پڻ جڏهن توهان کي اهو طئي ڪرڻو پوندو ته نتيجو ڪنهن مخصوص فائل سان تعلق رکي ٿو.

ٽاسڪ ٽئين پارٽي لائبريري لاءِ سپورٽ شامل ڪريو جيڪڏهن نحو مڪمل طور تي سپورٽ نه آهي

حل: مختلف فريم ورڪ جو تعداد جيڪي ڪوڊ لکڻ جي عمل ۾ استعمال ڪيا ويا آھن صرف چارٽ کان پري آھي. يقينن، چيڪ مارڪس هميشه انهن جي وجود جي باري ۾ نه ڄاڻندو آهي، ۽ اسان جو ڪم اهو آهي ته هن کي اهو سمجهڻ سيکاريو ته ڪجهه طريقا خاص طور تي هن فريم ورڪ سان تعلق رکن ٿيون. ڪڏهن ڪڏهن هن حقيقت جي ڪري پيچيده ٿي ويندو آهي ته فريم ورڪ فنڪشن جا نالا استعمال ڪن ٿا جيڪي تمام عام آهن ۽ اهو ناممڪن آهي ته ڪنهن خاص لائبريري سان ڪنهن خاص ڪال جي تعلق کي غير واضح طور تي طئي ڪرڻ.

ڏکيائي اها آهي ته اهڙين لائبريرين جي نحو کي هميشه صحيح طرح سان نه سڃاتو وڃي ٿو ۽ توهان کي وڏي تعداد ۾ غلط مثبت حاصل ڪرڻ کان بچڻ لاءِ تجربو ڪرڻو پوندو. اسڪيننگ جي درستگي کي بهتر ڪرڻ ۽ مسئلو حل ڪرڻ لاءِ ڪيترائي آپشن آھن:

  • پهريون اختيار، اسان پڪ ڄاڻون ٿا ته لائبريري هڪ مخصوص منصوبي ۾ استعمال ڪئي وئي آهي ۽ ٽيم جي سطح تي ضابطو لاڳو ڪري سگهي ٿو. پر جيڪڏهن ٽيم فيصلو ڪري ٿي ته هڪ مختلف طريقو اختيار ڪيو وڃي يا ڪيتريون ئي لائبريريون استعمال ڪيون وڃن جن ۾ فنڪشن جا نالا اوورليپ ٿين ٿا، اسان حاصل ڪري سگهون ٿا تمام گهڻي خوشگوار تصوير ڪيترن ئي غلط مثبتن جي.

  • ٻيو اختيار فائلن کي ڳولڻ لاء آهي جنهن ۾ لائبريري واضح طور تي درآمد ٿيل آهي. هن طريقي سان، اسان پڪ ڪري سگهون ٿا ته لائبريري اسان کي گهربل آهي بلڪل هن فائل ۾ استعمال ڪيو ويو آهي.

  • ۽ ٽيون اختيار اهو آهي ته مٿين ٻنهي طريقن کي گڏجي استعمال ڪيو وڃي.

مثال طور، اچو ته هڪ لئبرريءَ تي نظر وجهون، جيڪا تنگ حلقن ۾ مشهور آهي چرچ اسڪالا پروگرامنگ ٻولي لاءِ، يعني ڪارڪردگي جدا جدا لغوي قدر. عام طور تي، هڪ SQL سوال ۾ پيراگراف پاس ڪرڻ لاء، توهان کي آپريٽر استعمال ڪرڻ گهرجي $، جيڪو ڊيٽا کي اڳوڻي SQL سوال ۾ تبديل ڪري ٿو. اھو آھي، حقيقت ۾، اھو جاوا ۾ تيار ڪيل بيان جو ھڪڙو سڌو اينالاگ آھي. پر، جيڪڏهن توهان کي متحرڪ طور تي هڪ SQL سوال ٺاهڻ جي ضرورت آهي، مثال طور، جيڪڏهن توهان کي ٽيبل جا نالا پاس ڪرڻ گهرجن، توهان استعمال ڪري سگهو ٿا آپريٽر #$, جيڪو سڌو سنئون ڊيٽا کي سوال ۾ متبادل ڪندو (تقريبا string concatenation وانگر).

نموني ڪوڊ:

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

چيڪ مارڪس اڃا تائين نه ٿو ڄاڻي ته ڪيئن استعمال ڪجي Splicing Literal Values ​​۽ skips آپريٽرز #$، پوءِ اچو ته ان کي سيکارڻ جي ڪوشش ڪريون امڪاني SQL انجيڪشن کي سڃاڻڻ ۽ ڪوڊ ۾ صحيح جڳهن کي اجاگر ڪرڻ لاءِ:

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

ٽاسڪ اوپن سورس لائبريرين ۾ استعمال ٿيل ڪمزور افعال جي ڳولا ڪريو

حل: ڪيتريون ئي ڪمپنيون استعمال ڪن ٿيون اوپن سورس مانيٽرنگ ٽولز (OSA مشق) ترقي يافته ايپليڪيشنن ۾ لائبريرين جي ڪمزور ورزن جي استعمال کي ڳولڻ لاءِ. ڪڏهن ڪڏهن اهو ممڪن ناهي ته اهڙي لائبريري کي محفوظ ورزن ۾ تازه ڪاري ڪرڻ. ڪجهه حالتن ۾ اتي فنڪشنل حدون آهن، ٻين ۾ ڪو به محفوظ نسخو نه آهي. انهي صورت ۾، SAST ۽ OSA عملن جو هڪ ميلاپ اهو طئي ڪرڻ ۾ مدد ڪندو ته اهي ڪم جيڪي ڪمزورين جي استحصال جو سبب بڻجن ٿا ڪوڊ ۾ استعمال نه ڪيا ويا آهن.

پر ڪڏهن ڪڏهن، خاص طور تي جڏهن جاوا اسڪرپٽ تي غور ڪيو وڃي، اهو شايد مڪمل طور تي معمولي ڪم نه هجي. هيٺ ڏنل حل آهي، شايد مثالي نه، پر ان جي باوجود ڪم ڪري رهيو آهي، جزو ۾ ڪمزورين جو مثال استعمال ڪندي lodash طريقن ۾ template и *set.

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

۽ جڏهن سڌو سنئون 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>

اسان ڳولي رھيا آھيون اسان جي سڀني ڪمزور طريقن کي، جيڪي خطرن ۾ درج ٿيل آھن:

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

ٽاسڪ ايپليڪيشن ۾ شامل ڪيل سرٽيفڪيٽن جي ڳولا

حل: ايپليڪيشنن لاءِ، خاص ڪري موبائيل وارن لاءِ، مختلف سرورن تائين رسائي حاصل ڪرڻ يا SSL-Pinning جي تصديق ڪرڻ لاءِ سرٽيفڪيٽ يا ڪيچ استعمال ڪرڻ غير معمولي ڳالهه ناهي. حفاظتي نقطه نظر کان، ڪوڊ ۾ اهڙيون شيون محفوظ ڪرڻ بهترين عمل ناهي. اچو ته هڪ قاعدو لکڻ جي ڪوشش ڪريون جيڪو مخزن ۾ ساڳيون فائلن جي ڳولا ڪندو:

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

ٽاسڪ ايپليڪيشن ۾ سمجھوتي ٽوڪن ڳولڻ

حل: اهو اڪثر ضروري آهي ته سمجھوتي ٽوڪن کي رد ڪرڻ يا ٻي اهم معلومات جيڪا ڪوڊ ۾ موجود آهي. يقينا، انهن کي ذخيرو ڪوڊ اندر رکڻ سٺو خيال ناهي، پر حالتون مختلف آهن. CxQL سوالن جي مهرباني، اهڙيون شيون ڳولڻ بلڪل آسان آهي:

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

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

ٿڪل

مون کي اميد آهي ته هي مضمون انهن لاءِ ڪارائتو هوندو جيڪي چيڪ مارڪ ٽول سان پنهنجي واقفيت شروع ڪري رهيا آهن. ٿي سگهي ٿو اهي جيڪي هڪ ڊگهي وقت تائين پنهنجا پنهنجا قاعدا لکي رهيا آهن انهن کي به هن گائيڊ ۾ ڪجهه مفيد ملندو.

بدقسمتي سان، هن وقت وسيلن جي کوٽ آهي جتي چيڪ مارڪس لاءِ ضابطن جي ترقيءَ دوران نوان خيال گڏ ڪري سگهجن ٿا. ان ڪري اسان پيدا ڪيو Github تي مخزن، جتي اسان پنهنجو ڪم پوسٽ ڪنداسين ته جيئن هر ماڻهو جيڪو CxQL استعمال ڪري ٿو ان ۾ ڪجهه ڪارائتو ڳولي سگهي ٿو، ۽ پڻ موقعو آهي پنهنجي ڪم کي ڪميونٽي سان شيئر ڪرڻ جو. مخزن مواد کي ڀرڻ ۽ ترتيب ڏيڻ جي عمل ۾ آهي، تنهن ڪري مدد ڏيندڙ ڀليڪار آهن!

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

جو ذريعو: www.habr.com

تبصرو شامل ڪريو