ለCheckmarx ህጎችን እንዴት እንደሚጽፉ እና እንዳያበዱ

ሃይ ሀብር!

በእኛ ሥራ፣ ኩባንያችን ብዙ ጊዜ ከተለያዩ የስታቲክ ኮድ ትንተና መሣሪያዎች (SAST) ጋር ይሠራል። ከሳጥኑ ውስጥ ሁሉም በአማካይ ይሰራሉ. እርግጥ ነው, ሁሉም በፕሮጀክቱ እና በእሱ ውስጥ ጥቅም ላይ የዋሉ ቴክኖሎጂዎች, እንዲሁም እነዚህ ቴክኖሎጂዎች በመተንተን ደንቦች ምን ያህል እንደተሸፈኑ ይወሰናል. በእኔ አስተያየት የ SAST መሣሪያን በሚመርጡበት ጊዜ በጣም አስፈላጊ ከሆኑት መመዘኛዎች ውስጥ አንዱ ለመተግበሪያዎችዎ ልዩ ሁኔታዎች ማለትም የመፃፍ እና የመለወጥ ደንቦችን ወይም ብዙውን ጊዜ ብጁ መጠይቆችን የማበጀት ችሎታ ነው።

ለCheckmarx ህጎችን እንዴት እንደሚጽፉ እና እንዳያበዱ

እኛ ብዙውን ጊዜ Checkmarx እንጠቀማለን - በጣም አስደሳች እና ኃይለኛ የኮድ ተንታኝ። በዚህ ጽሑፍ ውስጥ ስለ እሱ ትንታኔ ደንቦችን የመጻፍ ልምድን እናገራለሁ.

ማውጫ

ግቤት

ለመጀመር፣ ለCheckmarx የመጻፍ መጠይቆችን በተመለከተ በሩሲያኛ ካሉት ጥቂት መጣጥፎች አንዱን ልመክር። በ2019 መጨረሻ ላይ በሀበሬ ላይ ታትሟል፡ በሚል ርዕስ "ሄሎ ቼክማርክስ!" የCheckmarx SAST ጥያቄን እንዴት እንደሚጽፉ እና ጥሩ ተጋላጭነቶችን ያግኙ.

ለአንዳንድ የፈተና አተገባበር የመጀመሪያዎቹን መጠይቆች በCxQL (Checkmarx Query Language) እንዴት እንደሚፃፍ በዝርዝር ይመረምራል እና የትንታኔ ህጎች እንዴት እንደሚሰሩ መሰረታዊ መርሆችን ያሳያል።

በውስጡ የተገለጸውን አልደግመውም, ምንም እንኳን አንዳንድ መገናኛዎች አሁንም ይገኛሉ. በጽሑፌ ውስጥ ከቼክማርክስ ጋር በምሠራበት ጊዜ ያጋጠሙኝን ልዩ ችግሮች የመፍትሄ ዝርዝሮችን አንድ ዓይነት “የምግብ አዘገጃጀት ስብስብ” ለማዘጋጀት እሞክራለሁ። በእነዚህ ብዙ ችግሮች ላይ አእምሮዬን መቆጣጠር ነበረብኝ። አንዳንድ ጊዜ በሰነዶቹ ውስጥ በቂ መረጃ አልነበረም, እና አንዳንድ ጊዜ የሚፈለገውን እንዴት እንደሚሰራ ለመረዳት እንኳን አስቸጋሪ ነበር. የእኔ ልምድ እና እንቅልፍ የሌላቸው ምሽቶች ከንቱ እንደማይሆኑ ተስፋ አደርጋለሁ, እና ይህ "የብጁ መጠይቆች የምግብ አዘገጃጀት ስብስብ" ለጥቂት ሰዓታት ወይም ሁለት የነርቭ ሴሎችን ይቆጥብልዎታል. ስለዚህ, እንጀምር!

ስለ ደንቦቹ አጠቃላይ መረጃ

በመጀመሪያ፣ ቀጥሎ ምን እንደሚፈጠር የተሻለ ግንዛቤ ለማግኘት ጥቂት መሰረታዊ ፅንሰ-ሀሳቦችን እና ከህጎቹ ጋር የመስራት ሂደትን እንመልከት። እና ደግሞ ሰነዱ ስለዚህ ጉዳይ ምንም ነገር አይናገርም ወይም በአወቃቀሩ ውስጥ በጣም የተዘረጋ ነው, ይህም በጣም ምቹ አይደለም.

  1. ደንቦቹ በመግቢያው ላይ በተመረጠው ቅድመ-ቅምጥ (የገባሪ ህጎች ስብስብ) ላይ በመመስረት በመቃኘት ጊዜ ይተገበራሉ። ያልተገደበ ቁጥር ያላቸው ቅድመ-ቅምጦች መፍጠር ይችላሉ, እና በትክክል እንዴት እነሱን ማዋቀር እንደሚችሉ በሂደትዎ ልዩ ነገሮች ላይ የተመሰረተ ነው. እነሱን በቋንቋ መቧደን ወይም ለእያንዳንዱ ፕሮጀክት ቅድመ-ቅምጦችን መምረጥ ይችላሉ። የንቁ ደንቦች ቁጥር የፍተሻውን ፍጥነት እና ትክክለኛነት ይነካል.

    ለCheckmarx ህጎችን እንዴት እንደሚጽፉ እና እንዳያበዱበCheckmarx በይነገጽ ውስጥ ቅድመ ዝግጅትን ማዋቀር

  2. ደንቦቹ CxAuditor በሚባል ልዩ መሣሪያ ውስጥ ተስተካክለዋል. ይህ ቼክማርክስን ከሚያሄድ አገልጋይ ጋር የሚገናኝ የዴስክቶፕ መተግበሪያ ነው። ይህ መሣሪያ ሁለት የአሠራር ዘዴዎች አሉት-ደንቦችን ማስተካከል እና ቀደም ሲል የተደረገውን ቅኝት ውጤቶችን መተንተን.

    ለCheckmarx ህጎችን እንዴት እንደሚጽፉ እና እንዳያበዱCxAudit በይነገጽ

  3. በቼክማርክስ ውስጥ ያሉ ደንቦች በቋንቋ የተከፋፈሉ ናቸው, ማለትም, እያንዳንዱ ቋንቋ የራሱ የሆነ መጠይቆች አሉት. እንዲሁም ቋንቋ ምንም ይሁን ምን ተግባራዊ የሆኑ አንዳንድ አጠቃላይ ሕጎች አሉ, እነዚህ መሰረታዊ መጠይቆች የሚባሉት ናቸው. ለአብዛኛው ክፍል፣ መሰረታዊ ጥያቄዎች ሌሎች ደንቦች የሚጠቀሙበትን መረጃ መፈለግን ያካትታሉ።

    ለCheckmarx ህጎችን እንዴት እንደሚጽፉ እና እንዳያበዱደንቦችን በቋንቋ መከፋፈል

  4. ደንቦቹ "ተፈፃሚ" እና "የማይፈፀም" (ተፈፃሚ እና ያልተፈፀመ) ናቸው. ትክክለኛው ስም አይደለም, በእኔ አስተያየት, ግን ያ ነው. ዋናው ነገር "ተፈፃሚ" ደንቦችን የማስፈጸም ውጤት በ UI ውስጥ ባለው የፍተሻ ውጤቶች ውስጥ ይታያል, እና "የማይተገበሩ" ደንቦች ውጤቶቻቸውን በሌሎች ጥያቄዎች ላይ ለመጠቀም ብቻ ያስፈልጋሉ (በመሰረቱ, ተግባር ብቻ).

    ለCheckmarx ህጎችን እንዴት እንደሚጽፉ እና እንዳያበዱሲፈጥሩ የደንቡን አይነት መወሰን

  5. አዲስ ደንቦችን መፍጠር ወይም ነባሮቹን መጨመር/እንደገና መፃፍ ይችላሉ። ደንቡን እንደገና ለመፃፍ በዛፉ ውስጥ ማግኘት ያስፈልግዎታል ፣ በቀኝ ጠቅ ያድርጉ እና ከተቆልቋይ ምናሌ ውስጥ “ሰርዝ” ን ይምረጡ። እዚህ ላይ አዲሶቹ ደንቦች በቅድመ-ቅምጦች ውስጥ ያልተካተቱ እና ንቁ ያልሆኑ መሆናቸውን ማስታወስ አስፈላጊ ነው. እነሱን መጠቀም ለመጀመር በመሳሪያው ውስጥ ባለው "ቅድመ-አቀናባሪ" ምናሌ ውስጥ እነሱን ማግበር ያስፈልግዎታል. እንደገና የተፃፉ ህጎች ቅንብሮቻቸውን ያቆያሉ ፣ ማለትም ፣ ህጉ ንቁ ከሆነ ፣ እንደዛ ይቆያል እና ወዲያውኑ ይተገበራል።

    ለCheckmarx ህጎችን እንዴት እንደሚጽፉ እና እንዳያበዱበቅድመ-አቀናባሪ በይነገጽ ውስጥ የአዲሱ ደንብ ምሳሌ

  6. በአፈፃፀም ወቅት የጥያቄዎች "ዛፍ" ተገንብቷል, ይህም በምን ላይ የተመሰረተ ነው. መረጃን የሚሰበስቡ ሕጎች በመጀመሪያ ይከናወናሉ, እና ሁለተኛውን የሚጠቀሙት. የማስፈጸሚያ ውጤቱ ተደብቋል, ስለዚህ አሁን ያለውን ህግ ውጤት መጠቀም ከተቻለ, ይህን ማድረጉ የተሻለ ነው, ይህ የፍተሻ ጊዜን ይቀንሳል.

  7. ህጎች በተለያዩ ደረጃዎች ሊተገበሩ ይችላሉ-

  • ለጠቅላላው ስርዓት - ለማንኛውም ፕሮጀክት ለማንኛውም ቅኝት ጥቅም ላይ ይውላል

  • በቡድን ደረጃ (ቡድን) - በተመረጠው ቡድን ውስጥ ያሉትን ፕሮጀክቶች ለመቃኘት ብቻ ጥቅም ላይ ይውላል.

  • በፕሮጀክት ደረጃ - በአንድ የተወሰነ ፕሮጀክት ውስጥ ተግባራዊ ይሆናል

    ለCheckmarx ህጎችን እንዴት እንደሚጽፉ እና እንዳያበዱደንቡ የሚተገበርበትን ደረጃ መወሰን

"መዝገበ ቃላት" ለጀማሪዎች

እና ጥያቄዎችን በሚፈጥሩኝ ጥቂት ነገሮች እጀምራለሁ, እና ህይወትን በእጅጉ የሚያቃልሉ በርካታ ዘዴዎችን አሳይሻለሁ.

ክዋኔዎች ከዝርዝሮች ጋር

- вычитание одного из другого (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 እና ሌሎች ከአቅማችን በላይ የሆኑ ያልተጠበቁ ሁኔታዎች. በዚህ አጋጣሚ አንዳንድ ጊዜ በመረጃ ቋቱ ውስጥ ያልተጠናቀቀ ክፍለ ጊዜ አለ, ይህም እንደገና እንዳይገቡ ይከለክላል. እሱን ለማስተካከል ብዙ መጠይቆችን ማሄድ ያስፈልግዎታል፡-

ከ 8.6 በፊት ለCheckmarx፡-

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

ከ8.6 በኋላ ለCheckmarx፡-

// Проверяем, что есть залогиненые пользователи, выполнив запрос в БД
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);

ተግባር መሣሪያው ምላሽ የሚሰጥበትን ሚስጥራዊነት ያለው ውሂብ ዝርዝር ዘርጋ

መፍትሔው: ቼክማርክስ መሰረታዊ ህጎች አሉት፣ ውጤቶቹ በብዙ ሌሎች መጠይቆች ጥቅም ላይ ይውላሉ። ከእነዚህ ህጎች ውስጥ የተወሰኑትን ለመተግበሪያዎ ልዩ መረጃ በማሟላት የፍተሻ ውጤቶችን ወዲያውኑ ማሻሻል ይችላሉ። እርስዎን ለመጀመር ከዚህ በታች ያለው ምሳሌ ነው፡-

አጠቃላይ_የግላዊነት_መጣስ_ዝርዝር

ሚስጥራዊነት ያለው መረጃ ለማከማቸት በእኛ መተግበሪያ ውስጥ ብዙ ተለዋዋጮችን እንጨምር፡-

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

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

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

ተግባር የተለዋዋጮችን ዝርዝር በይለፍ ቃል ዘርጋ

መፍትሔው: የይለፍ ቃሎችን በኮድ ውስጥ ለመወሰን እና በኩባንያዎ ውስጥ በብዛት ጥቅም ላይ የሚውሉትን የተለዋዋጭ ስሞች ዝርዝር ለመጨመር ወደ መሰረታዊ ህግ ወዲያውኑ ትኩረት እንዲሰጡ እመክራለሁ።

የይለፍ ቃል_ግላዊነት_መጣስ_ዝርዝር

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 የማይደገፉ ያገለገሉ ማዕቀፎችን ያክሉ

መፍትሔው: በCheckmarx ውስጥ ያሉ ሁሉም ጥያቄዎች በቋንቋ የተከፋፈሉ ናቸው፣ ስለዚህ ለእያንዳንዱ ቋንቋ ደንቦችን ማከል ያስፈልግዎታል። ከታች እንደዚህ ያሉ ደንቦች አንዳንድ ምሳሌዎች ናቸው.

መደበኛ ተግባራትን የሚያሟሉ ወይም የሚተኩ ቤተ-መጻሕፍት ጥቅም ላይ ከዋሉ, በቀላሉ ወደ መሰረታዊ ህግ ሊጨመሩ ይችላሉ. ከዚያ የሚጠቀሙት ሁሉ ወዲያውኑ ስለ አዲሱ መግቢያዎች ይማራሉ. እንደ ምሳሌ አንድሮይድ ውስጥ ለመግባት ቤተ-መጻሕፍት ቲምበር እና ሎግጊ ናቸው። በመሠረታዊ ጥቅል ውስጥ የስርዓት ያልሆኑ ጥሪዎችን ለመለየት ምንም ደንቦች የሉም, ስለዚህ የይለፍ ቃል ወይም የክፍለ-ጊዜ መለያ ወደ ምዝግብ ማስታወሻው ውስጥ ከገባ ስለእሱ አናውቅም. በCheckmarx ደንቦች ላይ የእንደዚህ አይነት ዘዴዎችን ትርጓሜዎች ለመጨመር እንሞክር.

የእንጨት ቤተመፃህፍትን ለመመዝገብ የሚጠቀም የፍተሻ ኮድ ምሳሌ፡-

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

እና ለCheckmarx ጥያቄ ምሳሌ እዚህ አለ ፣ ይህም የቲምበር ዘዴዎችን የመጥራት ፍቺ ከመተግበሪያው የውሂብ መውጫ ነጥብ እንዲያክሉ ያስችልዎታል።

አንድሮይድ ውፅዓት ያግኙ

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

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

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

እንዲሁም ወደ ጎረቤት ህግ ማከል ይችላሉ ፣ ግን ይህ በቀጥታ አንድሮይድ ከመግባት ጋር ይዛመዳል

አንድሮይድ ሎግ_ውጤቶችን አግኝ

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

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

እንዲሁም አንድሮይድ መተግበሪያዎች የሚጠቀሙ ከሆነ የስራ አስተዳዳሪ ለተመሳሳይ ስራ ከስራው ላይ መረጃ ለማግኘት ዘዴን በመጨመር ስለዚህ ለCheckmarx ማሳወቅ ጥሩ ሀሳብ ነው getInputData:

አንድሮይድReadን አግኝ

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

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

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

ተግባር ለ iOS ፕሮጄክቶች በፕላስት ውስጥ ሚስጥራዊነት ያለው መረጃን በመፈለግ ላይ

መፍትሔው: iOS ብዙ ጊዜ የተለያዩ ተለዋዋጮችን እና እሴቶችን ለማከማቸት ከ.plist ቅጥያ ጋር ልዩ ፋይሎችን ይጠቀማል። የይለፍ ቃሎችን፣ ቶከኖችን፣ ቁልፎችን እና ሌሎች ሚስጥራዊነት ያላቸውን መረጃዎች በእነዚህ ፋይሎች ውስጥ ማከማቸት አይመከርም፣ ምክንያቱም ከመሳሪያው ላይ ያለ ምንም ችግር ሊወጡ ይችላሉ።

የፕሊስት ፋይሎች ለራቁት ዓይን ግልጽ ያልሆኑ ባህሪያት አሏቸው፣ ነገር ግን ለCheckmarx አስፈላጊ ናቸው። የምንፈልገውን ዳታ የሚፈልግ ህግ እንፃፍ እና የሆነ ቦታ የይለፍ ቃሎች ወይም ቶከኖች ከተጠቀሱ ይንገሩን ።

ከጀርባ አገልግሎት ጋር ለመገናኘት ማስመሰያ የያዘ የእንደዚህ አይነት ፋይል ምሳሌ፡-

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

እና በሚጽፉበት ጊዜ ግምት ውስጥ መግባት ያለባቸው በርካታ ልዩነቶች ላለው ለ Checkmarx ደንብ

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

ተግባር በኤክስኤምኤል ውስጥ መረጃ ማግኘት

መፍትሔው: Checkmarx ከኤክስኤምኤል ጋር ለመስራት እና እሴቶችን፣ መለያዎችን፣ ባህሪያትን እና ሌሎችን ለመፈለግ በጣም ምቹ ተግባራት አሉት። ግን በሚያሳዝን ሁኔታ, በሰነዱ ውስጥ አንድም ምሳሌ የማይሰራበት ስህተት ነበር. ምንም እንኳን ይህ ጉድለት በሰነዶቹ የቅርብ ጊዜ ስሪት ውስጥ የተሰረዘ ቢሆንም ፣ ቀደም ያሉ የሰነዶች ስሪቶችን ከተጠቀሙ ይጠንቀቁ።

ከሰነዱ የተሳሳተ ምሳሌ ይኸውና፡-

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

በግድያው ሙከራ ምክንያት, ያንን ስህተት እንቀበላለን All እንደዚህ አይነት ዘዴ የለም… እና ይህ እውነት ነው ፣ ምክንያቱም ከኤክስኤምኤል ጋር ለመስራት ተግባራትን ለመጠቀም ልዩ ፣ የተለየ የነገር ቦታ ስላለ - cxXPath. በአንድሮይድ ውስጥ የኤችቲቲፒ ትራፊክን መጠቀም የሚያስችል ቅንብር ለማግኘት ትክክለኛው መጠይቅ ይህን ይመስላል፡-

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

የሁሉም ተግባራት አገባብ ተመሳሳይ ስለሆነ በጥቂቱ በዝርዝር እንመልከተው፣ አንዱን ካወቁ በኋላ፣ የሚፈልጉትን መምረጥ ብቻ ያስፈልግዎታል። ስለዚህ, በቅደም ተከተል እንደ መለኪያዎች:

  • "*.xml"- ለመፈለግ የፋይሎች ጭምብል

  • 8 - ደንቡ የሚተገበርበት ቋንቋ መታወቂያ

  • "cleartextTrafficPermitted"- የባህሪ ስም በ xml

  • "true" - የዚህ ባህሪ ዋጋ

  • false - ሲፈልጉ መደበኛ አገላለጽ መጠቀም

  • true - ማለት ፍለጋው የሚከናወነው ጉዳይን ችላ በማለት ነው ፣ ማለትም ፣ ኬዝ - ግድየለሽነት

እንደ ምሳሌ፣ ከደህንነት እይታ አንጻር፣ በአንድሮይድ ውስጥ ከአገልጋዩ ጋር በኤችቲቲፒ ፕሮቶኮል መገናኘትን የሚፈቅደውን የአውታረ መረብ ግንኙነት ቅንጅቶችን ከደህንነት አንፃር፣ ትክክል ያልሆነን የሚለይ ህግን ተጠቀምን። ባህሪን የያዘ ቅንብር ምሳሌ 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'
  ...
}

እና ለ Checkmarx ደንብ፡-

ProGuardObfuscationNotInUse

// Поиск метода release среди всех методов в Gradle файлах
CxList releaseMethod = Find_Gradle_Method("release");

// Все объекты из файлов build.gradle
CxList gradleBuildObjects = Find_Gradle_Build_Objects();

// Поиск того, что находится внутри метода "release" среди всех объектов из файлов build.gradle
CxList methodInvokesUnderRelease = gradleBuildObjects.FindByType(typeof(MethodInvokeExpr)).GetByAncs(releaseMethod);

// Ищем внутри gradle-файлов строку "com.android.library" - это значит, что данный файл относится к библиотеке и его необходимо исключить из правила
CxList android_library = gradleBuildObjects.FindByName("com.android.library");

// Инициализация пустого массива
List<string> libraries_path = new List<string> {};

// Проходим через все найденные "дочерние" файлы
foreach(CxList library in android_library)
{
    // Получаем путь к каждому файлу
	string file_name_library = library.GetFirstGraph().LinePragma.FileName;
    
    // Добавляем его в наш массив
	libraries_path.Add(file_name_library);
}

// Ищем все вызовы включения обфускации в релизных настройках
CxList minifyEnabled = methodInvokesUnderRelease.FindByShortName("minifyEnabled");

// Получаем параметры этих вызовов
CxList minifyValue = gradleBuildObjects.GetParameters(minifyEnabled, 0);

// Ищем среди них включенные
CxList minifyValueTrue = minifyValue.FindByShortName("true");

// Немного магии, если не нашли стандартным способом :D
if (minifyValueTrue.Count == 0) {
	minifyValue = minifyValue.FindByAbstractValue(abstractValue => abstractValue is TrueAbstractValue);
} else {
    // А если всё-таки нашли, то предыдущий результат и оставляем
	minifyValue = minifyValueTrue;	
}

// Если не нашлось таких методов
if (minifyValue.Count == 0)
{
    // Для более корректного отображения места срабатывания в файле ищем или buildTypes или android
	CxList tempResult = All.NewCxList();
	CxList buildTypes = Find_Gradle_Method("buildTypes");
	if (buildTypes.Count > 0) {
		tempResult = buildTypes;
	} else {
		tempResult = Find_Gradle_Method("android");
	}
	
	// Для каждого из найденных мест срабатывания проходим и определяем, дочерний или основной файлы сборки
	foreach(CxList res in tempResult)
	{
        // Определяем, в каком файле был найден buildType или android методы
		string file_name_result = res.GetFirstGraph().LinePragma.FileName;
        
        // Если такого файла нет в нашем списке "дочерних" файлов - значит это основной файл и его можно добавить в результат
		if (libraries_path.Contains(file_name_result) == false){
			result.Add(res);
		}
	}
}

ይህ አካሄድ ለአንድሮይድ አፕሊኬሽኖች ብቻ ሳይሆን ውጤቱ የአንድ የተወሰነ ፋይል መሆን አለመሆኑን ለመወሰን በሚያስፈልግበት ጊዜ ሁሉን አቀፍ እና ጠቃሚ ሊሆን ይችላል።

ተግባር አገባቡ ሙሉ በሙሉ ካልተደገፈ ለሶስተኛ ወገን ቤተ-መጽሐፍት ድጋፍ ያክሉ

መፍትሔው: ኮድን በመጻፍ ሂደት ውስጥ ጥቅም ላይ የሚውሉ የተለያዩ ማዕቀፎች ብዛት በቀላሉ ከገበታዎቹ ውጭ ነው። በእርግጥ ቼክማርክስ ስለ ሕልውናቸው ሁልጊዜ አያውቅም፣ እና የእኛ ተግባር አንዳንድ ዘዴዎች ለዚህ ማዕቀፍ የተካተቱ መሆናቸውን እንዲረዳ ማስተማር ነው። አንዳንድ ጊዜ ማዕቀፎች በጣም የተለመዱ የተግባር ስሞችን ስለሚጠቀሙ እና የአንድን የተወሰነ ቤተ-መጽሐፍት ግንኙነት በማያሻማ ሁኔታ ለመወሰን የማይቻል በመሆኑ ይህ የተወሳሰበ ነው።

አስቸጋሪው ነገር የእንደዚህ አይነት ቤተ-መጻሕፍት አገባብ ሁልጊዜ በትክክል አለመታወቁ እና ብዙ ቁጥር ያላቸውን የውሸት አወንታዊ ውጤቶችን ላለማግኘት መሞከር አለብዎት። የፍተሻ ትክክለኛነትን ለማሻሻል እና ችግሩን ለመፍታት ብዙ አማራጮች አሉ-

  • የመጀመሪያው አማራጭ, ቤተ-መጽሐፍት በአንድ የተወሰነ ፕሮጀክት ውስጥ ጥቅም ላይ እንደሚውል እና ደንቡን በቡድን ደረጃ መተግበር እንደሚችሉ በእርግጠኝነት እናውቃለን. ነገር ግን ቡድኑ የተለየ አካሄድ ለመውሰድ ከወሰነ ወይም የተግባር ስሞች የሚደራረቡባቸውን በርካታ ቤተ-መጻሕፍት ከተጠቀመ ብዙ የውሸት አወንታዊ መረጃዎችን በጣም ደስ የሚል ምስል ማግኘት እንችላለን።

  • ሁለተኛው አማራጭ ቤተ መጻሕፍቱ በግልጽ የገባባቸውን ፋይሎች መፈለግ ነው። በዚህ አቀራረብ፣ የምንፈልገው ቤተ-መጽሐፍት በዚህ ፋይል ውስጥ በትክክል ጥቅም ላይ እንደዋለ እርግጠኛ መሆን እንችላለን።

  • ሦስተኛው አማራጭ ከላይ ያሉትን ሁለቱን አካሄዶች አንድ ላይ መጠቀም ነው።

እንደ ምሳሌ፣ በጠባብ ክበቦች ውስጥ በደንብ የሚታወቅ ቤተ መጻሕፍትን እንመልከት ማንሸራተት ለ Scala ፕሮግራሚንግ ቋንቋ ማለትም ተግባራዊነቱ ስፕሊንግ ቀጥተኛ እሴቶች. በአጠቃላይ መለኪያዎችን ወደ SQL መጠይቅ ለማለፍ ኦፕሬተሩን መጠቀም አለብዎት $, ይህም ውሂብ ወደ ቅድመ-የተሰራ የSQL መጠይቅ ይተካል። ያም ማለት፣ በእውነቱ፣ በጃቫ የተዘጋጀ የተዘጋጀ መግለጫ ቀጥተኛ አናሎግ ነው። ነገር ግን፣ የSQL ጥያቄን በተለዋዋጭ መንገድ መገንባት ከፈለጉ፣ ለምሳሌ፣ የሰንጠረዥ ስሞችን ማለፍ ከፈለጉ ኦፕሬተሩን መጠቀም ይችላሉ። #$, ይህም ውሂቡን ወደ መጠይቁ በቀጥታ ይተካዋል (እንደ ሕብረቁምፊ ማያያዝ ማለት ይቻላል)።

የኮድ ምሳሌ፡-

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

ቼክማርክስ የስፕሊኪንግ ቀጥተኛ እሴቶችን አጠቃቀም እንዴት እንደሚያውቅ እስካሁን አያውቅም እና ኦፕሬተሮችን ይዘለላል #$ስለዚህ የ 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));
}

ተግባር በOpen-Source ቤተ-መጽሐፍት ውስጥ ያገለገሉ ተጋላጭ ተግባራትን ይፈልጉ

መፍትሔው: ብዙ ኩባንያዎች በዳበሩ አፕሊኬሽኖች ውስጥ ተጋላጭ የሆኑ የቤተ-መጻህፍት ስሪቶችን መጠቀምን ለመለየት ክፍት-ምንጭ መከታተያ መሳሪያዎችን (OSA practice) ይጠቀማሉ። አንዳንድ ጊዜ እንዲህ ያለውን ቤተ-መጽሐፍት ወደ አስተማማኝ ስሪት ማዘመን አይቻልም. በአንዳንድ ሁኔታዎች የተግባር ገደቦች አሉ, በሌሎች ውስጥ ምንም አስተማማኝ ስሪት የለም. በዚህ ሁኔታ የ 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!'

እና በቀጥታ በኤችቲኤምኤል ሲገናኙ፡-

<!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 የሚጠቀም ሁሉ ጠቃሚ ነገር እንዲያገኝ እና ስራቸውን ከማህበረሰቡ ጋር የማካፈል እድል እንዲኖራቸው ስራችንን የምንለጥፍበት ነው። ማከማቻው ይዘትን በመሙላት እና በማዋቀር ሂደት ላይ ነው፣ ስለዚህ አስተዋጽዖ አበርካቾች እንኳን ደህና መጡ!

ለሚያደርጉት ጥረት እናመሰግናለን!

ምንጭ: hab.com

አስተያየት ያክሉ