पागल बिना चेकमार्क्सको लागि नियमहरू कसरी लेख्ने

हे हाबर!

हाम्रो काममा, हाम्रो कम्पनीले प्राय: विभिन्न स्थिर कोड विश्लेषण उपकरणहरू (SAST) सँग व्यवहार गर्छ। बक्स बाहिर तिनीहरू सबै औसत काम गर्छन्। निस्सन्देह, यो सबै परियोजना र यसमा प्रयोग गरिएका प्रविधिहरूमा निर्भर गर्दछ, साथै यी प्रविधिहरू विश्लेषणका नियमहरूद्वारा कत्तिको राम्ररी समेटिएका छन्। मेरो विचारमा, SAST उपकरण छनोट गर्दा सबैभन्दा महत्त्वपूर्ण मापदण्डहरू मध्ये एक भनेको यसलाई तपाइँको एप्लिकेसनको विशिष्टता अनुसार अनुकूलित गर्ने क्षमता हो, अर्थात्, लेख्ने र विश्लेषण नियमहरू परिवर्तन गर्ने वा, जसलाई प्राय: कस्टम प्रश्नहरू भनिन्छ।

पागल बिना चेकमार्क्सको लागि नियमहरू कसरी लेख्ने

हामी प्राय: चेकमार्क्स प्रयोग गर्छौं - एक धेरै रोचक र शक्तिशाली कोड विश्लेषक। यस लेखमा म यसको लागि विश्लेषण नियमहरू लेख्ने मेरो अनुभवको बारेमा कुरा गर्नेछु।

सामग्रीको तालिका

प्रवेश

सुरुमा, म चेकमार्क्सका लागि प्रश्नहरू लेख्ने सुविधाहरूको बारेमा रूसीमा केही लेखहरू मध्ये एउटा सिफारिस गर्न चाहन्छु। यो शीर्षक अन्तर्गत 2019 को अन्त्यमा Habré मा प्रकाशित भएको थियो: "नमस्ते, चेकमार्क्स!" कसरी चेकमार्क्स SAST क्वेरी लेख्ने र राम्रो कमजोरीहरू फेला पार्नुहोस्.

यसले केही परीक्षण अनुप्रयोगको लागि CxQL (Checkmarx Query Language) मा पहिलो प्रश्नहरू कसरी लेख्ने भनेर विस्तृत रूपमा जाँच गर्छ र विश्लेषण नियमहरूले कसरी काम गर्छ भन्ने आधारभूत सिद्धान्तहरू देखाउँछ।

म यसमा वर्णन गरिएको कुरा दोहोर्याउने छैन, यद्यपि केही प्रतिच्छेदनहरू अझै पनि उपस्थित हुनेछन्। मेरो लेखमा म एक प्रकारको "रेसिपीहरूको संग्रह" कम्पाइल गर्ने प्रयास गर्नेछु, चेकमार्क्सको साथ मेरो कामको क्रममा मैले सामना गरेको विशेष समस्याहरूको समाधानहरूको सूची। यी धेरै समस्याहरूमा मैले मेरो दिमाग र्याक गर्नुपर्‍यो। कहिलेकाहीं कागजातमा पर्याप्त जानकारी थिएन, र कहिलेकाहीँ यो कसरी आवश्यक थियो भनेर बुझ्न गाह्रो थियो। मलाई आशा छ कि मेरो अनुभव र निद्रा नलागेको रातहरू व्यर्थ हुनेछैन, र यो "कस्टम क्वेरी रेसिपीहरूको संग्रह" ले तपाईंलाई केही घण्टा वा केही स्नायु कोशिकाहरू बचाउनेछ। त्यसोभए, सुरु गरौं!

नियमहरूमा सामान्य जानकारी

पहिले, केही आधारभूत अवधारणाहरू र नियमहरूसँग काम गर्ने प्रक्रियालाई हेरौं, त्यसपछि के हुनेछ भनेर राम्रोसँग बुझ्नको लागि। र यो पनि किनभने कागजातले यस बारे केही बोल्दैन वा संरचनामा धेरै फैलिएको छ, जुन धेरै सुविधाजनक छैन।

  1. नियमहरू स्क्यानिङको समयमा लागू हुन्छन् सुरुमा चयन गरिएको प्रिसेट (सक्रिय नियमहरूको सेट) मा निर्भर गर्दछ। तपाइँ असीमित संख्यामा प्रिसेटहरू सिर्जना गर्न सक्नुहुन्छ, र वास्तवमा तिनीहरूलाई कसरी संरचना गर्ने तपाइँको प्रक्रियाको विशिष्टतामा निर्भर गर्दछ। तपाइँ तिनीहरूलाई भाषा अनुसार समूहबद्ध गर्न सक्नुहुन्छ वा प्रत्येक परियोजनाको लागि प्रिसेटहरू चयन गर्न सक्नुहुन्छ। सक्रिय नियमहरूको संख्याले स्क्यानिङको गति र शुद्धतालाई असर गर्छ।

    पागल बिना चेकमार्क्सको लागि नियमहरू कसरी लेख्नेचेकमार्क इन्टरफेसमा प्रिसेट सेट अप गर्दै

  2. नियमहरू CxAuditor भनिने विशेष उपकरणमा सम्पादन गरिएका छन्। यो एउटा डेस्कटप अनुप्रयोग हो जुन चेकमार्क्स चलिरहेको सर्भरमा जडान हुन्छ। यस उपकरणसँग सञ्चालनका दुई मोडहरू छन्: नियमहरू सम्पादन गर्ने र पहिले नै गरिएको स्क्यानको परिणामहरूको विश्लेषण।

    पागल बिना चेकमार्क्सको लागि नियमहरू कसरी लेख्नेCxAudit इन्टरफेस

  3. चेकमार्कमा नियमहरू भाषाद्वारा विभाजित हुन्छन्, अर्थात्, प्रत्येक भाषाको आफ्नै प्रश्नहरूको सेट हुन्छ। त्यहाँ केहि सामान्य नियमहरू पनि छन् जुन भाषाको परवाह नगरी लागू हुन्छ, यी तथाकथित आधारभूत प्रश्नहरू हुन्। धेरै जसो भागको लागि, आधारभूत प्रश्नहरूले अन्य नियमहरूले प्रयोग गर्ने जानकारीको खोजी समावेश गर्दछ।

    पागल बिना चेकमार्क्सको लागि नियमहरू कसरी लेख्नेभाषा द्वारा नियम विभाजन

  4. नियमहरू "कार्यान्वयनयोग्य" र "नन-एक्जिक्युटेबल" (कार्यान्वयन गरिएको र कार्यान्वयन नगरिएको) हुन्। मेरो विचारमा एकदम सही नाम होइन, तर यो के हो। तल्लो रेखा यो हो कि "कार्यान्वयनयोग्य" नियमहरू कार्यान्वयन गर्ने परिणाम UI मा स्क्यान परिणामहरूमा प्रदर्शित हुनेछ, र "नन-एक्जिक्युटेबल" नियमहरू अन्य अनुरोधहरूमा उनीहरूको नतिजाहरू प्रयोग गर्नका लागि मात्र आवश्यक छ (संक्षेपमा, केवल एक प्रकार्य)।

    पागल बिना चेकमार्क्सको लागि नियमहरू कसरी लेख्नेसिर्जना गर्दा नियम प्रकार निर्धारण गर्दै

  5. तपाईं नयाँ नियमहरू सिर्जना गर्न सक्नुहुन्छ वा अवस्थितहरूलाई पूरक/पुनर्लेखन गर्न सक्नुहुन्छ। नियम पुन: लेख्नको लागि, तपाईंले यसलाई रूखमा फेला पार्न आवश्यक छ, दायाँ क्लिक गर्नुहोस् र ड्रप-डाउन मेनुबाट "ओभरराइड" चयन गर्नुहोस्। यहाँ याद राख्नु महत्त्वपूर्ण छ कि नयाँ नियमहरू प्रारम्भमा प्रिसेटहरूमा समावेश गरिएका छैनन् र सक्रिय छैनन्। तिनीहरूलाई प्रयोग गर्न सुरु गर्न तपाईंले उपकरणको "प्रिसेट प्रबन्धक" मेनुमा सक्रिय गर्न आवश्यक छ। पुन: लेखिएका नियमहरूले तिनीहरूको सेटिङहरू कायम राख्छन्, अर्थात्, यदि नियम सक्रिय थियो भने, यो त्यस्तै रहनेछ र तुरुन्तै लागू हुनेछ।

    पागल बिना चेकमार्क्सको लागि नियमहरू कसरी लेख्नेप्रिसेट प्रबन्धक इन्टरफेसमा नयाँ नियमको उदाहरण

  6. कार्यान्वयनको क्रममा, अनुरोधहरूको "रूख" बनाइएको छ, जुन केमा निर्भर गर्दछ। जानकारी सङ्कलन गर्ने नियमहरू पहिले कार्यान्वयन गरिन्छ, र दोस्रो प्रयोग गर्नेहरू। कार्यान्वयन परिणाम क्यास गरिएको छ, त्यसैले यदि अवस्थित नियमको नतिजाहरू प्रयोग गर्न सम्भव छ भने, त्यसो गर्नु राम्रो हुन्छ, यसले स्क्यानिङ समय कम गर्नेछ।

  7. नियमहरू विभिन्न स्तरहरूमा लागू गर्न सकिन्छ:

  • सम्पूर्ण प्रणालीको लागि - कुनै पनि परियोजनाको स्क्यानिङको लागि प्रयोग गरिनेछ

  • टोली स्तर (Team) मा - चयन गरिएको टोलीमा परियोजनाहरू स्क्यान गर्न मात्र प्रयोग गरिनेछ।

  • परियोजना स्तर मा - एक विशेष परियोजना मा लागू गरिनेछ

    पागल बिना चेकमार्क्सको लागि नियमहरू कसरी लेख्नेनियम लागू हुने स्तर निर्धारण गर्दै

शुरुआती लागि "शब्दकोश"

र म केहि चीजहरूबाट सुरु गर्नेछु जसले मलाई प्रश्नहरू उत्पन्न गर्यो, र म जीवनलाई महत्त्वपूर्ण रूपमा सरल बनाउने धेरै प्रविधिहरू पनि देखाउनेछु।

सूची संग सञ्चालन

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

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

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

भेटिएका सबै वस्तुहरू

स्क्यान गरिएको भाषा भित्र, तपाईंले चेकमार्क्सले पहिचान गरेको सबै तत्वहरूको सूची प्राप्त गर्न सक्नुहुन्छ (स्ट्रिङहरू, प्रकार्यहरू, वर्गहरू, विधिहरू, आदि)। यो पहुँच गर्न सकिने वस्तुहरूको केही ठाउँ हो All। त्यो हो, एक विशेष नाम संग एक वस्तु खोजी गर्न searchMe, तपाईले खोज्न सक्नुहुन्छ, उदाहरणका लागि, सबै फेला परेका वस्तुहरूमा नामद्वारा:

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

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

तर, यदि तपाईंले अर्को भाषामा खोजी गर्न आवश्यक छ जुन कुनै कारणले स्क्यानमा समावेश गरिएको थिएन (उदाहरणका लागि, एन्ड्रोइड प्रोजेक्टमा ग्रूवी), तपाईंले भ्यारीएबल मार्फत हाम्रो वस्तु स्पेस विस्तार गर्न सक्नुहुन्छ:

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 र अन्य अप्रत्याशित परिस्थितिहरू जुन हाम्रो नियन्त्रण बाहिर छन्। यस अवस्थामा, कहिलेकाहीँ डाटाबेसमा अधूरो सत्र हुन्छ, जसले तपाईंलाई फेरि लगइन गर्नबाट रोक्छ। यसलाई ठीक गर्न, तपाईंले धेरै प्रश्नहरू चलाउन आवश्यक छ:

८.६ भन्दा पहिले चेकमार्कको लागि:

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

८.६ पछि चेकमार्कको लागि:

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

लेखन नियमहरू

अब हामी सबैभन्दा रोचक भागमा पुग्छौं। जब तपाइँ CxQL मा नियमहरू लेख्न थाल्नुहुन्छ, तपाइँसँग प्राय: केहि समस्याहरू समाधान गर्ने र सामान्य रूपमा प्रश्नहरू कसरी काम गर्ने प्रक्रियाको वर्णन गर्ने केही जीवित उदाहरणहरू जत्तिकै धेरै कागजातहरूको अभाव हुँदैन।

म क्वेरी भाषामा डुब्न थालेकाहरूको लागि जीवनलाई थोरै सजिलो बनाउन प्रयास गर्नेछु र केही समस्याहरू समाधान गर्न अनुकूलन प्रश्नहरू प्रयोग गर्ने धेरै उदाहरणहरू दिनेछु। तिनीहरूमध्ये केही एकदम सामान्य छन् र तपाईंको कम्पनीमा व्यावहारिक रूपमा परिवर्तनहरू बिना प्रयोग गर्न सकिन्छ, अरूहरू अधिक विशिष्ट छन्, तर तिनीहरू तपाईंको अनुप्रयोगहरूको विशिष्टताहरू अनुरूप कोड परिवर्तन गरेर पनि प्रयोग गर्न सकिन्छ।

त्यसोभए, यहाँ हामीले प्रायः सामना गर्ने समस्याहरू छन्:

कार्य: नियम कार्यान्वयन गर्दा नतिजाहरूमा धेरै प्रवाहहरू छन् र ती मध्ये एउटा अर्कोको गुँड हो, तपाईंले ती मध्ये एउटा छोड्नुपर्छ।

समाधान: वास्तवमा, कहिलेकाहीँ चेकमार्क्सले धेरै डेटा प्रवाहहरू देखाउँदछ जुन ओभरल्याप हुन सक्छ र अरूको छोटो संस्करण हुन सक्छ। यस्तो अवस्थामा एक विशेष विधि छ प्रवाह घटाउनुहोस्। प्यारामिटरमा निर्भर गर्दै, यसले छोटो वा सबैभन्दा लामो प्रवाह चयन गर्नेछ:

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

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

कार्य: संवेदनशील डेटाको सूची विस्तार गर्नुहोस् जसमा उपकरणले प्रतिक्रिया गर्दछ

समाधान: चेकमार्कमा आधारभूत नियमहरू छन्, जसका परिणामहरू अन्य धेरै प्रश्नहरूद्वारा प्रयोग गरिन्छ। यी नियमहरू मध्ये केहीलाई तपाइँको एप्लिकेसनको लागि विशिष्ट डेटाको साथ पूरक गरेर, तपाइँ तुरुन्तै तपाइँको स्क्यान परिणामहरू सुधार गर्न सक्नुहुन्छ। तपाइँ सुरु गर्न को लागी तल एक उदाहरण नियम छ:

General_privacy_violation_list

संवेदनशील जानकारी भण्डारण गर्न हाम्रो अनुप्रयोगमा प्रयोग गरिएका धेरै चरहरू थपौं:

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

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

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

कार्य: पासवर्डहरूको साथ चरहरूको सूची विस्तार गर्नुहोस्

समाधान: म तुरुन्तै कोडमा पासवर्डहरू परिभाषित गर्नको लागि आधारभूत नियममा ध्यान दिन र तपाइँको कम्पनीमा सामान्यतया प्रयोग हुने चल नामहरूको सूची थप्न सिफारिस गर्दछु।

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

कार्य: प्रयोग गरिएको फ्रेमवर्कहरू थप्नुहोस् जुन चेकमार्क्स द्वारा समर्थित छैन

समाधान: चेकमार्कमा भएका सबै प्रश्नहरू भाषाद्वारा विभाजित हुन्छन्, त्यसैले तपाईंले प्रत्येक भाषाका लागि नियमहरू थप्नुपर्छ। तल त्यस्ता नियमहरूको केही उदाहरणहरू छन्।

यदि पुस्तकालयहरू प्रयोग गरिन्छ जुन मानक कार्यक्षमतालाई पूरक वा प्रतिस्थापन गर्दछ, तिनीहरू सजिलै आधारभूत नियममा थप्न सकिन्छ। त्यसपछि यसलाई प्रयोग गर्ने सबैले तुरुन्तै नयाँ परिचयहरूको बारेमा सिक्नेछन्। उदाहरणको रूपमा, एन्ड्रोइडमा लग इन गर्नका लागि पुस्तकालयहरू टिम्बर र लगगी हुन्। आधारभूत प्याकेजमा, गैर-प्रणाली कलहरू पहिचान गर्नका लागि कुनै नियमहरू छैनन्, त्यसैले यदि पासवर्ड वा सत्र पहिचानकर्ता लगमा पुग्छ भने, हामीलाई यसको बारेमा थाहा हुँदैन। चेकमार्क नियमहरूमा त्यस्ता विधिहरूको परिभाषा थप्ने प्रयास गरौं।

लगिङका लागि टिम्बर लाइब्रेरी प्रयोग गर्ने परीक्षण कोड उदाहरण:

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

र यहाँ चेकमार्क्सको लागि अनुरोधको एक उदाहरण छ, जसले तपाईंलाई टिम्बर विधिहरू कल गर्ने परिभाषा थप्न अनुमति दिनेछ एप्लिकेसनबाट डेटाको लागि बाहिर निस्कने बिन्दुको रूपमा:

एन्ड्रोइडआउटपुटहरू खोज्नुहोस्

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

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

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

र तपाइँ छिमेकी नियममा पनि थप्न सक्नुहुन्छ, तर यो सिधै एन्ड्रोइडमा लगिङसँग सम्बन्धित छ:

FindAndroidLog_Outputs

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

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

साथै, यदि एन्ड्रोइड अनुप्रयोगहरू प्रयोग गर्दछ कार्य प्रबन्धक एसिन्क्रोनस कार्यको लागि, कार्यबाट डाटा प्राप्त गर्ने विधि थपेर यस बारे चेकमार्कलाई थप जानकारी दिनु राम्रो विचार हो। 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। एन्ड्रोइडमा HTTP ट्राफिकको प्रयोगलाई अनुमति दिने सेटिङ फेला पार्नको लागि यो सही क्वेरी जस्तो देखिन्छ:

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

यसलाई थोरै विस्तारमा हेरौं, किनकि सबै प्रकार्यहरूको लागि सिन्ट्याक्स समान छ, तपाईंले एउटा पत्ता लगाइसकेपछि, तपाईंले भर्खरै तपाईंलाई चाहिने एउटा चयन गर्न आवश्यक छ। त्यसैले, मापदण्डहरू अनुसार क्रमिक रूपमा:

  • "*.xml"- खोजी गर्न फाइलहरूको मास्क

  • 8 - नियम लागू भएको भाषाको आईडी

  • "cleartextTrafficPermitted"- xml मा विशेषता नाम

  • "true" - यो विशेषता को मूल्य

  • false - खोजी गर्दा नियमित अभिव्यक्तिको प्रयोग

  • true - यसको मतलब केस बेवास्ता गरेर खोजी गरिनेछ, त्यो केस-संवेदनशील छ

उदाहरणको रूपमा, हामीले एक नियम प्रयोग गर्यौं जसले गलत पहिचान गर्दछ, सुरक्षा दृष्टिकोणबाट, एन्ड्रोइडमा नेटवर्क जडान सेटिङहरू जसले 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>

कार्य: फाइल नाम/मार्ग द्वारा परिणाम सीमित गर्नुहोस्

समाधान: एन्ड्रोइडको लागि मोबाइल अनुप्रयोगको विकाससँग सम्बन्धित ठूला परियोजनाहरू मध्ये एउटामा, हामीले अस्पष्टता सेटिङ निर्धारण गर्ने नियमको गलत सकारात्मकताहरू सामना गर्यौं। तथ्य यो हो कि बाकसको नियमले फाइलमा खोज्छ 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);
		}
	}
}

यो दृष्टिकोण एकदम सार्वभौमिक र एन्ड्रोइड अनुप्रयोगहरूको लागि मात्र उपयोगी हुन सक्छ, तर अन्य केसहरूको लागि पनि जब तपाईंले परिणाम निश्चित फाइलको हो कि भनेर निर्धारण गर्न आवश्यक छ।

कार्य: यदि सिन्ट्याक्स पूर्ण रूपमा समर्थित छैन भने तेस्रो पक्षको पुस्तकालयको लागि समर्थन थप्नुहोस्

समाधान: कोड लेख्ने प्रक्रियामा प्रयोग हुने बिभिन्न फ्रेमवर्कहरूको संख्या केवल चार्टहरू बन्द छ। निस्सन्देह, चेकमार्क्सलाई सधैं तिनीहरूको अस्तित्वको बारेमा थाहा हुँदैन, र हाम्रो कार्यलाई यो ढाँचामा निश्चित विधिहरू विशेष रूपमा सम्बन्धित छन् भनेर बुझ्न सिकाउनु हो। कहिलेकाहीँ यो तथ्यले जटिल हुन्छ कि फ्रेमवर्कहरूले प्रकार्य नामहरू प्रयोग गर्दछ जुन धेरै सामान्य छन् र यो एक विशेष पुस्तकालयमा विशेष कलको सम्बन्धलाई स्पष्ट रूपमा निर्धारण गर्न असम्भव छ।

कठिनाई यो हो कि त्यस्ता पुस्तकालयहरूको वाक्यविन्यास सधैं सही रूपमा पहिचान हुँदैन र तपाईंले ठूलो संख्यामा झूटा सकारात्मक प्राप्त गर्नबाट बच्न प्रयोग गर्नुपर्छ। स्क्यानिङ शुद्धता सुधार गर्न र समस्या समाधान गर्न धेरै विकल्पहरू छन्:

  • पहिलो विकल्प, हामीलाई निश्चित रूपमा थाहा छ कि पुस्तकालय एक विशेष परियोजनामा ​​प्रयोग गरिन्छ र टोली स्तरमा नियम लागू गर्न सक्छ। तर यदि टोलीले फरक दृष्टिकोण लिने निर्णय गर्छ वा धेरै पुस्तकालयहरू प्रयोग गर्दछ जसमा प्रकार्य नामहरू ओभरल्याप हुन्छन् भने, हामीले धेरै झूटा सकारात्मकहरूको धेरै सुखद तस्वीर प्राप्त गर्न सक्छौं।

  • दोस्रो विकल्प फाइलहरू खोज्नु हो जसमा पुस्तकालय स्पष्ट रूपमा आयात गरिएको छ। यस दृष्टिकोणको साथ, हामी निश्चित हुन सक्छौं कि हामीलाई चाहिएको पुस्तकालय यस फाइलमा ठ्याक्कै प्रयोग गरिएको छ।

  • र तेस्रो विकल्प माथिका दुई दृष्टिकोणहरू सँगै प्रयोग गर्नु हो।

उदाहरणको रूपमा, साँघुरो सर्कलहरूमा प्रसिद्ध पुस्तकालयलाई हेरौं चलाख Scala प्रोग्रामिङ भाषाको लागि, अर्थात्, कार्यक्षमता शाब्दिक मानहरू विभाजित गर्दै। सामान्यतया, SQL क्वेरीमा प्यारामिटरहरू पास गर्न, तपाईंले अपरेटर प्रयोग गर्नुपर्छ $, जसले डेटालाई पूर्वनिर्धारित SQL क्वेरीमा प्रतिस्थापन गर्छ। त्यो हो, वास्तवमा, यो जाभा मा तयार बयान को एक प्रत्यक्ष एनालग हो। तर, यदि तपाइँ गतिशील रूपमा SQL क्वेरी निर्माण गर्न आवश्यक छ, उदाहरणका लागि, यदि तपाइँ तालिका नामहरू पास गर्न आवश्यक छ भने, तपाइँ अपरेटर प्रयोग गर्न सक्नुहुन्छ। #$, जसले डेटालाई क्वेरीमा सीधै प्रतिस्थापन गर्नेछ (लगभग स्ट्रिङ कन्कटेनेसन जस्तै)।

नमूना कोड:

// В общем случае - значения, контролируемые пользователем
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

एक टिप्पणी थप्न