لیست CWE Top 25 برای سال 2023 که نشون دهنده نقاط ضعف خطرناک نرم افزاری هستش توسط MITRE منتشر شده.
ضعف های نرم افزاری طیف گسترده ای از مشکلات از جمله : نقص ها ، باگ ها ، آسیب پذیری ها و خطاها در کد، معماری ، پیاده سازی و طراحی نرم افزار رو در بر میگیرن.
این نقاط ضعف ،امنیت نرم افزارها رو به خطر میندازن بطوریکه CISA در این خصوص هشداری صادر کرده و اعلام کرده که این نقاط ضعف منجر به آسیب پذیری های جدی در نرم افزار میشه. مهاجم با سوء استفاده از این آسیب پذیری ها امکان کنترل سیستم، سرقت داده ها و DoS داره.
CWE مخفف Common Weakness Enumeration هستش . CVEها اغلب نشون دهنده یه آسیب پذیری در یه نرم افزار و نسخه مربوط به اون هستن و کمک میکنن تا تیم های قرمز راههای برای هک پیدا کنن و تیم های آبی درهایی که رو به هکرها باز کردن رو ببندن. اما CWEها نشون دهنده علت و ریشه آسیب پذیری هستن. مثلا اینکه در یه CVE گفته میشه، آسیب پذیری از نوع سریزبافر هستش در حقیقت داریم CWE رو مشخص میکنیم که نشون دهنده علت آسیب پذیری هستش. این CWEها برای توسعه دهندگان اکسپلویت و برنامه ها میتونه خیلی کاربردی باشه. توسعه دهندگان میتونن با نقاط ضعف کدهاشون آشنا بشن و اونارو امن کنن و توسعه دهندگان اکسپلویت نقطه ضعف برنامه رو میدونن و میتونن اکسپلویتش کنن.
این لیست اینجوری تهیه شده که MITRE اومده 43,996 ، CVE که در سالهای 2021 و 2022 در NVD ثبت شدن با تمرکز بر CVEهایی که در لیست KEV قرار گرفته آنالیز کرده و براساس شدت و گستردگیشون، اونارو امتیازبندی کرده.
این لیست CWE Top 25 براساس نقاط ضعفی که در دو سال قبل تاثیر و گستردگی زیادی داشتن تهیه شده. برای مشاهده CWE Top 25 برای سال 2022 هم میتونید این لینک رو مشاهده کنید.
لیست کامل برای سال 2023 بصورت زیر هستش :
Rank | ID | Name | Score | CVEs in KEV | Rank Change |
---|---|---|---|---|---|
1 | CWE-787 | Out-of-bounds Write | 63.72 | 70 | 0 |
2 | CWE-79 | Improper Neutralization of Input During Web Page Generation (‘Cross-site Scripting’) | 45.54 | 4 | 0 |
3 | CWE-89 | Improper Neutralization of Special Elements used in an SQL Command (‘SQL Injection’) | 34.27 | 6 | 0 |
4 | CWE-416 | Use After Free | 16.71 | 44 | +3 |
5 | CWE-78 | Improper Neutralization of Special Elements used in an OS Command (‘OS Command Injection’) | 15.65 | 23 | +1 |
6 | CWE-20 | Improper Input Validation | 15.50 | 35 | -2 |
7 | CWE-125 | Out-of-bounds Read | 14.60 | 2 | -2 |
8 | CWE-22 | Improper Limitation of a Pathname to a Restricted Directory (‘Path Traversal’) | 14.11 | 16 | 0 |
9 | CWE-352 | Cross-Site Request Forgery (CSRF) | 11.73 | 0 | 0 |
10 | CWE-434 | Unrestricted Upload of File with Dangerous Type | 10.41 | 5 | 0 |
11 | CWE-862 | Missing Authorization | 6.90 | 0 | +5 |
12 | CWE-476 | NULL Pointer Dereference | 6.59 | 0 | -1 |
13 | CWE-287 | Improper Authentication | 6.39 | 10 | +1 |
14 | CWE-190 | Integer Overflow or Wraparound | 5.89 | 4 | -1 |
15 | CWE-502 | Deserialization of Untrusted Data | 5.56 | 14 | -3 |
16 | CWE-77 | Improper Neutralization of Special Elements used in a Command (‘Command Injection’) | 4.95 | 4 | +1 |
17 | CWE-119 | Improper Restriction of Operations within the Bounds of a Memory Buffer | 4.75 | 7 | +2 |
18 | CWE-798 | Use of Hard-coded Credentials | 4.57 | 2 | -3 |
19 | CWE-918 | Server-Side Request Forgery (SSRF) | 4.56 | 16 | +2 |
20 | CWE-306 | Missing Authentication for Critical Function | 3.78 | 8 | -2 |
21 | CWE-362 | Concurrent Execution using Shared Resource with Improper Synchronization (‘Race Condition’) | 3.53 | 8 | +1 |
22 | CWE-269 | Improper Privilege Management | 3.31 | 5 | +7 |
23 | CWE-94 | Improper Control of Generation of Code (‘Code Injection’) | 3.30 | 6 | +2 |
24 | CWE-863 | Incorrect Authorization | 3.16 | 0 | +4 |
25 | CWE-276 | Incorrect Default Permissions | 3.16 | 0 | -5 |
در ادامه هم نگاهی کوتاه به هر یک از این نقاط ضعف میندازیم.
Out-of-bounds Write :
این آسیب پذیری مشخص بود که در رتبه اول قرار میگیره، نمونه اش در پست هایی که در خصوص آسیب پذیری های منتشر شده در ZDI میبنیم، که هر هفته شاهد کلی آسیب پذیری از این نوع هستیم. آسیب پذیری اینجوریه که یه بافر داریم، اگه بتونیم داده ای رو قبل از شروع اون یا بعد از انتهای اون بنویسیم به این آسیب پذیری می رسیم. نمونه برای این آسیب پذیری CVE-2021-21220 هستش.
مثال کد آسیب پذیر برای Out-of-bounds Write :
1 2 3 4 5 6 7 8 |
int id_sequence[3]; /* Populate the id array. */ id_sequence[0] = 123; id_sequence[1] = 234; id_sequence[2] = 345; id_sequence[3] = 456; |
در کد بالا ما یه آرایه با طول 3 تعریف کردیم، اما 4 مقدار دادیم، در حقیقت ما id_sequence[3] رو خارج از محدوده آرایه نوشتیم و آسیب پذیری Out-of-bounds Write رو داریم.
Improper Neutralization of Input During Web Page Generation (‘Cross-site Scripting’) :
این آسیب پذیری هم جزء آسیب پذیری هایی هستش که این روزها خیلی میبینیمش بخصوص بین هانترها. آسیب پذیری به XSS معروفه و به دلیل عدم کنترل کافی و درست ورودی کاربر ،قبل از اینکه اونو در خروجی یه صفحه وب قرار بده، ایجاد میشه. عمدتا جاوااسکریپت تزریق میشه و سه نوع داره. نمونه برای این آسیب پذیری CVE-2021-25926 هستش.
نمونه کد آسیب پذیر برای XSS :
1 2 |
$username = $_GET['username']; echo '<div class="header"> Welcome, ' . $username . '</div>'; |
در مثال بالا چون username کنترل نمیشه و مستقیما در خروجی چاپ میشه، اگه مهاجم درخواست زیر بفرسته، به XSS میرسه :
1 |
http://trustedSite.example.com/welcome.php?username=<Script Language="Javascript">alert("You've been attacked!");</Script> |
Improper Neutralization of Special Elements used in an SQL Command (‘SQL Injection’) :
آسیب پذیری زمانی اتفاق می افته که برنامه، ورودی کاربر رو به درستی کنترل نمیکنه و اونو مستقیما در یه کوئری دیتابیس قرار میده. نمونه برای این آسیب پذیری CVE-2021-42258 .
نمونه کد آسیب پذیر برای SQLi :
1 2 |
txtUserId = getRequestString("UserId"); txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId; |
در کد بالا، برنامه UserId رو میگیره اما اونو اعتبارسنجی نمیکنه و مستقیما در کوئری دیتابیسی قرار میده، مهاجم میتونه مثلا با استفاده از ورودی زیر در فیلد UserID :
1 |
105; DROP TABLE Suppliers |
کوئری رو تبدیل به کوئری زیر میکنه که جدول Suppliers رو پاک میکنه.
1 |
SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers; |
Use After Free :
برنامه داده هایی در یه بخشی از حافظه داره، بعد از انجام عملیاتی اونو آزاد میکنه، اما بعدش دوباره به تصور اینکه همچنان به اون داده ها دسترسی داره، اون بخش از حافظه رو میخونه که منجر به کرش برنامه، مواجه با مقادیر غیر منتظره و اجرای کد میشه. بهش Dangling pointer هم میگن و نمونه آسیب پذیری براش CVE-2021-0920 هستش.
نمونه کد آسیب پذیر به Use After Free:
1 2 3 4 5 6 7 8 9 |
char* ptr = (char*)malloc (SIZE); if (err) { abrt = 1; free(ptr); } ... if (abrt) { logError("operation aborted before commit", ptr); } |
در مثال بالا، یه خطایی رخ داده و ptr که یه اشاره گر هستش، free شده. اما در ادامه دوباره از اون استفاده شده که منجر به آسیب پذیری use after free یا uaf میشه.
Improper Neutralization of Special Elements used in an OS Command (‘OS Command Injection’) :
برنامه به دلیل عدم کنترل و اعتبارسنجی ورودی، امکان اجرای دستورات سیستم عاملی رو فراهم میکنه. بهش Shell injection هم میگن. نمونه آسیب پذیری براش CVE-2020-10987 .
نمونه کد آسیب پذیر به OS Command Injection
1 2 3 |
$userName = $_POST["user"]; $command = 'ls -l /home/' . $userName; system($command); |
در کد بالا ، برنامه ورودی رو میگیره و بدون اینکه چک کنه اونو با system اجرا میکنه. مهاجم با ارسال درخواست زیر بعنوان user :
1 |
;rm -rf / |
مقدار متغیر command رو تبدیل به دستور زیر میکنه که منجر به پاک شدن / میشه :
1 |
ls -l /home/;rm -rf / |
Improper Input Validation :
برنامه ورودی یا داده ای رو دریافت میکنه اما اونو به درستی اعتبارسنجی نمیکنه که اون داده یا ورودی برای پردازش، ایمن و درست هست یا نه. نمونه آسیب پذیری CVE-2021-30860 .
نمونه کد آسیب پذیر برای Improper Input Validation
1 2 3 4 |
public static final double price = 20.00; int quantity = currentUser.getAttribute("quantity"); double total = price * quantity; chargeUser(total); |
در کد بالا برنامه مقدار ورودی quantity رو اعتبارسنجی نمیکنه و بنابراین مهاجم میتونه با دادن مقدار منفی، بجای کسر کردن، افزایش موجودی میکنه.
Out-of-bounds Read :
آسیب پذیری اینجوریه که یه بافر داریم، اگه بتونیم داده ای رو قبل از شروع اون یا بعد از انتهای اون بخونیم به این آسیب پذیری می رسیم. نمونه آسیب پذیری CVE-2020-11899 .
نمونه کد آسیب پذیر برای Out-of-bounds Read :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
int getValueFromArray(int *array, int len, int index) { int value; // check that the array index is less than the maximum // length of the array if (index < len) { // get the value at the specified index of the array value = array[index]; } // if array index is invalid then output error message // and return value indicating error else { printf("Value is: %d\n", array[index]); value = -1; } return value; } |
در مثال بالا ، برنامه بررسی میکنه که مقدار index کمتر از مقدار حداکثر len باشه، اما مقدار حداقل رو چک نمیکنه و اگه مقدار منفی بدیم، میتونیم خارج از محدوده بافر بخونیم.
Improper Limitation of a Pathname to a Restricted Directory (‘Path Traversal’) :
برنامه مسیری رو مثلا از ورودی میگیره که برای شناسایی مسیر یا فولدری در یه محدوده استفاده میکنه، اما این ورودی رو به درستی اعتبارسنجی نمیکنه و امکان میده تا مهاجم خارج از محدوده هم دسترسی داشته باشه. بهش Directory traversal هم میگن. نمونه آسیب پذیری CVE-2022-31503 .
نمونه کد آسیب پذیر برای Path Traversal :
1 2 3 4 5 6 7 8 9 10 |
my $dataPath = "/users/cwe/profiles"; my $username = param("user"); my $profilePath = $dataPath . "/" . $username; open(my $fh, "<", $profilePath) || ExitError("profile read error: $profilePath"); print "<ul>\n"; while (<$fh>) { print "<li>$_</li>\n"; } print "</ul>\n"; |
در کد بالا برنامه نویس ، برنامه رو محدود به یه مسیری کرده و انتظار داره که کاربر به مسیرهایی مانند /users/cwe/profiles/onhexgroup دسترسی داشته باشه، اما چون ورودی رو بررسی نمیکنه ، بنابراین مهاجم با دادن ورودی زیر به جای user :
1 |
../../../etc/passwd |
مسیر محدود رو تبدیل به مسیر زیر میکنه که میتونه به passwd دسترسی داشته باشه.
1 |
/users/cwe/profiles/../../../etc/passwd |
Cross-Site Request Forgery (CSRF) :
آسیب پذیری به دلیل عدم بررسی مناسب درخواست کاربر توسط برنامه وب، از این لحاظ که معتبر و شکل درستی داشته باشه ، رخ میده. بهش Session Riding یا XSRF هم میگن. نمونه آسیب پذیری CVE-2009-3759 .
نمونه کد آسیب پذیر برای CSRF :
فرض کنید یه سایت داریم که کد html زیر داره:
1 2 3 4 5 6 7 |
<form action="/url/profile.php" method="post"> <input type="text" name="firstname"/> <input type="text" name="lastname"/> <br/> <input type="text" name="email"/> <input type="submit" name="submit" value="Update"/> </form> |
و کد profile.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// initiate the session in order to validate sessions session_start(); //if the session is registered to a valid user then allow update if (! session_is_registered("username")) { echo "invalid session detected!"; // Redirect user to login page [...] exit; } // The user session is valid, so process the request // and update the information update_profile(); function update_profile { // read in the data from $POST and send an update // to the database SendUpdateToDatabase($_SESSION['username'], $_POST['email']); [...] echo "Your profile has been successfully updated."; } |
مهاجم یه سایت مخرب راه اندازی میکنه و کدهای زیر توش قرار میده، کاربر که در سایت victim.example.com لاگین هستش، با مشاهده کد مهاجم منجر به ارسال درخواست بدون اطلاعش میشه که منجر به تغییر ایمیل و نام کاربری قربانی میشه.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<SCRIPT> function SendAttack () { form.email = "attacker@example.com"; // send to profile.php form.submit(); } </SCRIPT> <BODY onload="javascript:SendAttack();"> <form action="http://victim.example.com/profile.php" id="form" method="post"> <input type="hidden" name="firstname" value="Funny"> <input type="hidden" name="lastname" value="Joke"> <br/> <input type="hidden" name="email"> </form> |
Unrestricted Upload of File with Dangerous Type :
برنامه امکان آپلود یا انتقال فایل از نوع مخرب داره که بصورت اتوماتیک پردازش میشه. نمونه آسیب پذیری CVE-2006-2428 .
نمونه کد آسیب پذیری Unrestricted Upload of File with Dangerous Type :
فرض کنید یه برنامه وب بصورت زیر داریم :
1 2 3 4 5 6 7 8 |
<form action="upload_picture.php" method="post" enctype="multipart/form-data"> Choose a file to upload: <input type="file" name="filename"/> <br/> <input type="submit" name="submit" value="Submit"/> </form> |
و کد upload_picture.php :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/ Define the target location where the picture being // uploaded is going to be saved. $target = "pictures/" . basename($_FILES['uploadedfile']['name']); // Move the uploaded file to the new location. if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target)) { echo "The picture has been successfully uploaded."; } else { echo "There was an error uploading the picture, please try again."; } |
چون فرمت فایلها بررسی نمیشه، بنابراین مهجام میتونه یه فایل مخرب با نام malicious.php و محتوای زیر آپلود کنه :
1 2 3 4 |
<?php system($_GET['cmd']); ?> |
Missing Authorization :
برنامه احرازهویت درستی موقعی که کاربر میخواد به منبعی دسترسی داشته باشه یا عملی رو انجام بده ، نداره. بهش AuthZ هم میگن. نمونه آسیب پذیری CVE-2022-24730 .
نمونه کد آسیب پذیری برای Missing Authorization :
1 2 3 4 5 6 7 8 9 10 |
function runEmployeeQuery($dbName, $name){ mysql_select_db($dbName,$globalDbHandle) or die("Could not open Database".$dbName); //Use a prepared statement to avoid CWE-89 $preparedStatement = $globalDbHandle->prepare('SELECT * FROM employees WHERE name = :name'); $preparedStatement->execute(array(':name' => $name)); return $preparedStatement->fetchAll(); } /.../ $employeeRecord = runEmployeeQuery('EmployeeDB',$_GET['EmployeeName']); |
در کد بالا اگرچه جلوی SQLi گرفته اما بررسی نمیکنه که کاربری که این کوئری رو فرستاده مجاز به چنین عملی هستش یا نه.
NULL Pointer Dereference :
برنامه به محتوای یه اشاره گر که انتظار داره توش داده باشه ارجاع داده میشه، اما محتوای اون Null هستش که معمولا منجر به کرش یا خاتمه برنامه میشه. بهش NPD یا null deref یا nil pointer dereference هم گفته میشه. نمونه آسیب پذیری CVE-2020-29652 .
نمونه کد آسیب پذیری برای NULL Pointer Dereference :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void host_lookup(char *user_supplied_addr){ struct hostent *hp; in_addr_t *addr; char hostname[64]; in_addr_t inet_addr(const char *cp); /*routine that ensures user_supplied_addr is in the right format for conversion */ validate_addr_form(user_supplied_addr); addr = inet_addr(user_supplied_addr); hp = gethostbyaddr( addr, sizeof(struct in_addr), AF_INET); strcpy(hostname, hp->h_name); } |
در کد بالا اگه user_supplied_addr مقدار معتبری داشته باشه اما hostname رو مشخص (resolve) نکنه ، gethostbyaddr مقدار null رو برمیگردونه و چون در ادامه اونو بررسی نمیکنه منجر به NULL pointer dereference در strcpy میشه.
Improper Authentication :
وقتی مهاجم ادعا میکنه که هویت خاصی داره، اما برنامه این ادعارو به درستی ثابت نمیکنه. بهش authentification یا AuthN یا AuthC هم گفته میشه. نمونه آسیب پذیری CVE-2022-36436 .
نمونه کد آسیب پذیر برای Improper Authentication :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
my $q = new CGI; if ($q->cookie('loggedin') ne "true") { if (! AuthenticateUser($q->param('username'), $q->param('password'))) { ExitError("Error: you need to log in first"); } else { # Set loggedin and user cookies. $q->cookie( -name => 'loggedin', -value => 'true' ); $q->cookie( -name => 'user', -value => $q->param('username') ); } } if ($q->cookie('user') eq "Administrator") { DoAdministratorTasks(); } |
در کد بالا اگه مقدار loggedin برابر true باشه، برنامه دور میخوره و میشه ادمین شد. برای این کار میشه از درخواست زیر استفاده کرد :
1 2 3 4 5 |
GET /cgi-bin/vulnerable.cgi HTTP/1.1 Cookie: user=Administrator Cookie: loggedin=true [body of request] |
Integer Overflow or Wraparound :
آسیب پذیری وقتی رخ میده که یه مقدار صحیح در محاسبه ای به یه مقدار خیلی بزرگ تبدیل میشه که امکان ذخیره و نمایش در اون نوع رو نداره ، در نتیجه تبدیل به یه مقدار کوچکتر یا منفی میشه. بنابراین منجر به تغییر رفتار در عملکرد برنامه میشه. اغلب با سایر آسیب پذیری ها ترکیب میشه. نمونه آسیب پذیری CVE-2022-21668 .
نمونه کد آسیب پذیر برای Integer Overflow :
1 2 3 4 5 |
nresp = packet_get_int(); if (nresp > 0) { response = xmalloc(nresp*sizeof(char*)); for (i = 0; i < nresp; i++) response[i] = packet_get_string(NULL); } |
در کد بالا اگه مقدار nresp برابر 1073741824 و مقدار sizeof(char*) که معمولا برابر 4 هست باشه، یه سرریز رخ میده. xmalloc مقدار size-t رو میگیره که برابر unsigned integer که مقداری بین 0 تا 4294967295 رو میگیره. اگه 1073741824 رو ضرب در 4 کنیم، مقدار 4,294,967,296 میشه. در نتیجه منجر به سریز و مقدار اون تبدیل به صفر میشه و در ادامه xmalloc مقدار صفر رو میگره.
Deserialization of Untrusted Data:
برنامه داده های غیرایمن رو deserialize میکنه بدون اینکه بررسی کنه که خروجی ، نتیجه معتبری داشته باشه. بهش Marshaling, Unmarshaling یا Pickling, Unpickling هم میگن. نمونه آسیب پذیری CVE-2015-8103 .
نمونه کد آسیب پذیر برای Deserialization of Untrusted Data :
1 2 3 4 5 6 |
try { File file = new File("object.obj"); ObjectInputStream in = new ObjectInputStream(new FileInputStream(file)); javax.swing.JButton button = (javax.swing.JButton) in.readObject(); in.close(); } |
در کد بالا، برنامه قبل از deserialize کردن، محتوا یا منبع فایل رو تایید نمیکنه . در نتیجه مهاجم میتونه با دستکاری فایل یا جایگزین کردن یه فایل مخرب ، اقدام دلخواه انجام بده.
Improper Neutralization of Special Elements used in a Command (‘Command Injection’) :
برنامه همه یا بخشی از یه دستور رو از ورودی میگیره و اونو اعتبارسنجی نمیکنه، در نتیجه امکان اجرای دستور رو میده. نمونه کد آسیب پذیر CVE-2022-36069 .
نمونه کد آسیب پذیری برای Command Injection :
1 2 3 4 5 |
int main(int argc, char** argv) { char cmd[CMD_MAX] = "/usr/bin/cat "; strcat(cmd, argv[1]); system(cmd); } |
هدف برنامه بالا اینه که یه ورودی از کاربر میگیره و اونو نمایش میده، اما اگه ورودی بصورت زیر داده بشه، نمایش به مشکل خورده و / پاک میشه.
1 |
;rm -rf / |
Improper Restriction of Operations within the Bounds of a Memory Buffer :
برخی از زبانهای برنامه نویسی آدرسدهی مستقیم مکانهای حافظه را امکانپذیر میکنن و بطور خودکار اطمینان نمیدن که این مکانها برای بافر حافظهای که به آن ارجاع داده میشه معتبر هستش یا نه. این میتونه باعث بشه که عملیات خوندن یا نوشتن در مکان هایی از حافظه انجام بشه که ممکنه با سایر متغیرها، ساختارهای داده یا داده های داخلی برنامه مرتبط باشه. بهش Buffer Overflow یا buffer overrun یا memory safety هم میگن. نمونه آسیب پذیری CVE-2021-22991 .
نمونه کد آسیب پذیری برای Improper Restriction of Operations within the Bounds of a Memory Buffer :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void host_lookup(char *user_supplied_addr){ struct hostent *hp; in_addr_t *addr; char hostname[64]; in_addr_t inet_addr(const char *cp); /*routine that ensures user_supplied_addr is in the right format for conversion */ validate_addr_form(user_supplied_addr); addr = inet_addr(user_supplied_addr); hp = gethostbyaddr( addr, sizeof(struct in_addr), AF_INET); strcpy(hostname, hp->h_name); } |
برنامه بالا یه IP از کاربر میگیره و اونو اعتبارسنجی میکنه و بعدش عمل looksup رو انجام میده و نتیجه رو در بافر مینویسه. بافری که برای این منظور در نظر گرفته شده 64 بایت هستش اما تضمینی نداره که hostname بزرگتر از این مقدار نباشه و البته اونو هم بررسی نمیکنه. مهاجم اگه یه آدرسی بده که یه hostname بزرگ برگردونه، باعث میشه برنامه روی داده های حساس بنویسه یا جریان کنترل رو به دست بگیره.
Use of Hard-coded Credentials :
محصول حاوی داده های حساس هاردکد شده مانند پسوردها، کلیدهای رمزنگاری و … هستش. نمونه آسیب پذیری CVE-2022-29953 .
نمونه کد برای Use of Hard-coded Credentials :
1 2 3 4 5 6 7 8 |
int VerifyAdmin(char *password) { if (strcmp(password, "Mew!")) { printf("Incorrect Password!\n"); return(0) } printf("Entering Diagnostic Mode...\n"); return(1); } |
Server-Side Request Forgery (SSRF) :
وب سرور یه URL یا درخواستی رو دریافت میکنه و محتوای اونو بدون اینکه بررسی کنه درخواست به مقصد مورد انتظار ارسال شده یا نه ارسال میکنه. بهش XSPA یا Cross Site Port Attack هم میگن. نمونه آسیب پذیری CVE-2021-26855 .
Missing Authentication for Critical Function :
برنامه هیچ احرازهویتی برای عملکردهایی که نیاز به احرازهویت کاربر داره یا مقدار قابل توجهی از منابع رو مصرف میکنه، انجام نمیده. نمونه آسیب پذیری CVE-2022-29951 .
نمونه کد آسیب پذیر برای Missing Authentication for Critical Function :
1 2 3 4 5 6 7 8 9 10 11 |
public BankAccount createBankAccount(String accountNumber, String accountType, String accountName, String accountSSN, double balance) { BankAccount account = new BankAccount(); account.setAccountNumber(accountNumber); account.setAccountType(accountType); account.setAccountOwnerName(accountName); account.setAccountOwnerSSN(accountSSN); account.setBalance(balance); return account; } |
کد بالا امکان ایجاد اکانت بانکی رو میده، اما هیچ مکانیزم احراز هویتی ، برای اطمینان از اینکه کاربر ایجاد کننده این حساب بانکی، اختیار ایجاد حساب های بانکی جدید رو داره، وجود نداره.
Concurrent Execution using Shared Resource with Improper Synchronization (‘Race Condition’) :
برنامه یسری کد داره که بطور همزمان روی یک منبع مشترک اجرا میشن. در نتیجه از یه کدی منبع مشترک رو تغییر بده در نتیجه اجرای سایر کدها میتونه اختلال ایجاد کنه. نمونه آسیب پذیری CVE-2022-29527 .
نمونه کد آسیب پذیر برای Race Condition :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$transfer_amount = GetTransferAmount(); $balance = GetBalanceFromDatabase(); if ($transfer_amount < 0) { FatalError("Bad Transfer Amount"); } $newbalance = $balance - $transfer_amount; if (($balance - $transfer_amount) < 0) { FatalError("Insufficient Funds"); } SendNewBalanceToDatabase($newbalance); NotifyUser("Transfer of $transfer_amount succeeded."); NotifyUser("New balance: $newbalance"); |
کد بالا کاری که میکنه اینه که یه مقداری میگیره و به حساب یه کاربر دیگه انتقال میده و از مقدار اصلی کم میکنه. مهاجم اگه برنامه رو مثلا دوبار همزمان اجرا کنه، اگه موجودی 100 باشه و مهاجم در اجرای اولی 30 تا بخواد انتقال بده، اما این اجرا با تاخیر اجرا بشه، در اجرای دوم هم مهاجم 100 تا رو داره و …
Improper Privilege Management :
محصول امتیازات رو به درستی اختصاص یا مدیریت نمیکنه و در نتیجه یه حوزه کنترلی ناخواسته برای بازیگر ایجاد میکنه. نمونه آسیب پذیری CVE-2001-1555 .
نمونه کد آسیب پذیری برای Improper Privilege Management :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
def makeNewUserDir(username): if invalidUsername(username): #avoid CWE-22 and CWE-78 print('Usernames cannot contain invalid characters') return False try: raisePrivileges() os.mkdir('/home/' + username) lowerPrivileges() except OSError: print('Unable to create new user directory for user:' + username) return False return True |
در کد بالا، برنامه امتیازش بالا می بره و بعدش یه دایرکتوری ایجاد کرده و امتیازش پایین میاره. مشکل اینجاست که اگه بعد از افزایش امتیاز و هنگام ایجاد دایرکتوری یه استثناء رخ بده، برنامه تا آخر با همون امتیاز بالا اجرا میشه.
Improper Control of Generation of Code (‘Code Injection’) :
محصول قسمتی یا کل یه بخش کد رو از ورودی دریافت میکنه و روی بخشی که روی سینتکس یا رفتار کد تاثیر میزاره ،اعتبارسنجی مناسبی انجام نمیده. نمونه آسیب پذیری CVE-2022-2054 .
نمونه کد آسیب پذیری برای Code Injection :
1 2 3 4 5 6 7 8 9 10 11 12 |
$MessageFile = "messages.out"; if ($_GET["action"] == "NewMessage") { $name = $_GET["name"]; $message = $_GET["message"]; $handle = fopen($MessageFile, "a+"); fwrite($handle, "<b>$name</b> says '$message'<hr>\n"); fclose($handle); echo "Message Saved!<p>\n"; } else if ($_GET["action"] == "ViewMessages") { include($MessageFile); } |
کد بالا پیام کاربر رو در فایل message مینویسه و امکان مشاهده اونو به کاربر میده. در حالیکه برنامه نویس انتظار داره که MessageFile شامل داده باشه، اما مهاجم درخواست زیر ارسال میکنه :
1 2 |
name=h4x0r message=%3C?php%20system(%22/bin/ls%20-l%22);?%3E |
که دیکد شدش :
1 |
<?php system("/bin/ls -l");?> |
این کد هر زمان که کاربران بخوان فال ببینن اجرا میشه.
Incorrect Authorization :
وقتی بازیگری به یه منبعی میخواد دسترسی داشته باشه یا عملی رو انجام بده، برنامه احرازهویت انجام نمیده یا به درستی انجام نمیده. درنتیجه مهاجم میتونه محدودیتهای دسترسی دور بزنه. بهش AuthZ هم میگن. نمونه آسیب پذیری CVE-2021-39155 .
نمونه کد آسیب پذیری برای Incorrect Authorization :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$role = $_COOKIES['role']; if (!$role) { $role = getRole('user'); if ($role) { // save the cookie to send out in future responses setcookie("role", $role, time()+60*60*2); } else{ ShowLoginScreen(); die("\n"); } } if ($role == 'Reader') { DisplayMedicalHistory($_POST['patient_ID']); } else{ die("You are not Authorized to view this record\n"); } |
کد بالا امکان مشاهده رکوردها به کاربران احرازهویت شده رو میده و برای احراز هویت هم از کوکی استفاده میکنه. مهاجم اگه مقدار کوکی role روی Reader بزاره، مکانیزم احرازهویت دور میخوره.
Incorrect Default Permissions :
در طول فرایند نصب، مجوزهای فایلهای نصب شده جوری هستش که هرکسی میتونه اونارو دستکاری کنه. نمونه آسیب پذیری CVE-2005-1941 .
منابع :