آسیب‌پذیری‌ باینری چیست

آسیب‌پذیری‌های باینری به نوع خاصی از آسیب‌پذیری‌های نرم‌افزاری اشاره دارد که در کد باینری یک برنامه یا سیستم رخ می‌دهد. این نوع آسیب‌پذیری‌ها می‌توانند منجر....

انتشار: , زمان مطالعه: 5 دقیقه
آسیب‌پذیری‌ باینری چیست به همراه مثال و کد
دسته بندی: امنیت سایبری تعداد بازدید: 176

آسیب‌پذیری‌ باینری چیست ؟

آسیب‌پذیری‌های باینری به نوع خاصی از آسیب‌پذیری‌های نرم‌افزاری اشاره دارد که در کد باینری یک برنامه یا سیستم رخ می‌دهد. این نوع آسیب‌پذیری‌ها می‌توانند منجر به سوءاستفاده‌های مختلفی مانند اجرای کد مخرب، دسترسی غیرمجاز به سیستم یا داده‌ها، یا خرابی سیستم شوند. برخی از آسیب‌پذیری‌های رایج باینری عبارتند از:

  1. سرریز بافر (Buffer Overflow): زمانی رخ می‌دهد که داده‌ها بیش از حد مجاز در یک بافر ذخیره می‌شوند و باعث می‌شوند که داده‌های اضافی در بخش‌های دیگر حافظه قرار گیرند. این می‌تواند به اجرای کد مخرب منجر شود.

  2. سرریز پشته (Stack Overflow): نوع خاصی از سرریز بافر که در پشته حافظه رخ می‌دهد. این نوع آسیب‌پذیری معمولاً برای اجرای کد مخرب و دستیابی به کنترل جریان برنامه استفاده می‌شود.

  3. فاصله‌گذاری قالب (Format String Vulnerability): زمانی رخ می‌دهد که ورودی‌های کاربر به طور مستقیم به تابع‌های قالب‌بندی (مثل printf در C) پاس داده می‌شوند بدون اینکه از نظر ایمنی بررسی شوند. این می‌تواند به افشای اطلاعات حساس یا اجرای کد مخرب منجر شود.

  4. استفاده از پس از آزادسازی (Use After Free): زمانی رخ می‌دهد که برنامه سعی می‌کند به حافظه‌ای دسترسی پیدا کند که قبلاً آزاد شده است. این می‌تواند به مشکلات جدی حافظه و امنیتی منجر شود.

  5. خواندن خارج از مرز (Out-of-Bounds Read): زمانی رخ می‌دهد که برنامه سعی می‌کند داده‌ای را از خارج از محدوده‌های معتبر حافظه بخواند. این می‌تواند به افشای اطلاعات حساس یا خرابی برنامه منجر شود.

  6. نوشتن خارج از مرز (Out-of-Bounds Write): زمانی رخ می‌دهد که برنامه سعی می‌کند داده‌ای را در خارج از محدوده‌های معتبر حافظه بنویسد. این می‌تواند به تغییر داده‌های حساس یا اجرای کد مخرب منجر شود.

برای کاهش این آسیب‌پذیری‌ها، استفاده از تکنیک‌های برنامه‌نویسی ایمن، بررسی ورودی‌ها، استفاده از ابزارهای تحلیل کد، و بهره‌گیری از مکانیسم‌های امنیتی مثل ASLR (Address Space Layout Randomization) و DEP (Data Execution Prevention) توصیه می‌شود.

اصطلاح صحیح در زبان انگلیسی برای آسیب‌پذیری‌ باینری "Binary Vulnerabilities" است.

مثال و به همراه کد نویسی برای آسیب‌پذیری‌ باینری

سرریز بافر (Buffer Overflow)

سرریز بافر زمانی رخ می‌دهد که داده‌های بیش از حد مجاز در یک بافر ذخیره می‌شوند و باعث می‌شوند که داده‌های اضافی در بخش‌های دیگر حافظه قرار گیرند. این می‌تواند به اجرای کد مخرب منجر شود.

مثال کد:

#include <iostream>
#include <cstring>

void bufferOverflow() {
    char buffer[10];
    std::cout << "Enter some text: ";
    std::cin >> buffer;  // No bounds checking
    std::cout << "You entered: " << buffer << std::endl;
}

int main() {
    bufferOverflow();
    return 0;
}

توضیح:

در این کد، یک بافر با اندازه ۱۰ بایت تعریف شده است. وقتی کاربر متنی با طول بیش از ۱۰ کاراکتر وارد کند، داده‌های اضافی باعث سرریز بافر می‌شوند و می‌توانند بخش‌های دیگر حافظه را تحت تاثیر قرار دهند.

سرریز پشته (Stack Overflow)

سرریز پشته نوع خاصی از سرریز بافر است که در پشته حافظه رخ می‌دهد. این نوع آسیب‌پذیری معمولاً برای اجرای کد مخرب و دستیابی به کنترل جریان برنامه استفاده می‌شود.

مثال کد:

#include <iostream>

void recursiveFunction() {
    int largeArray[10000];  // Large array to quickly exhaust stack space
    std::cout << "Recursive call" << std::endl;
    recursiveFunction();  // Infinite recursion
}

int main() {
    recursiveFunction();
    return 0;
}

توضیح:

در این کد، تابع recursiveFunction به صورت بی‌نهایت فراخوانی می‌شود و هر بار یک آرایه بزرگ را در پشته تخصیص می‌دهد. این باعث می‌شود که پشته به سرعت پر شود و در نهایت باعث سرریز پشته (Stack Overflow) می‌شود.

فاصله‌گذاری قالب (Format String Vulnerability)

این نوع آسیب‌پذیری زمانی رخ می‌دهد که ورودی‌های کاربر به طور مستقیم به تابع‌های قالب‌بندی مانند printf پاس داده می‌شوند بدون اینکه از نظر ایمنی بررسی شوند.

مثال کد:

#include <iostream>
#include <cstdio>

void formatStringVulnerability(char *userInput) {
    printf(userInput);  // No format string specified
}

int main() {
    char input[100];
    std::cout << "Enter a format string: ";
    std::cin >> input;
    formatStringVulnerability(input);
    return 0;
}

توضیح:

در این کد، ورودی کاربر به طور مستقیم به printf پاس داده می‌شود. اگر کاربر یک رشته قالب‌بندی مانند %x %x %x وارد کند، اطلاعات حساس حافظه می‌تواند فاش شود.

استفاده از پس از آزادسازی (Use After Free)

این آسیب‌پذیری زمانی رخ می‌دهد که برنامه سعی می‌کند به حافظه‌ای دسترسی پیدا کند که قبلاً آزاد شده است.

مثال کد:

#include <iostream>
#include <cstdlib>

void useAfterFree() {
    int *ptr = (int*) malloc(sizeof(int));
    *ptr = 42;
    free(ptr);
    std::cout << *ptr << std::endl;  // Accessing memory after it has been freed
}

int main() {
    useAfterFree();
    return 0;
}

توضیح:

در این کد، حافظه‌ای تخصیص داده شده و مقداری به آن اختصاص یافته است. پس از آزادسازی حافظه با free(ptr), برنامه دوباره به آن حافظه دسترسی پیدا می‌کند که می‌تواند منجر به رفتارهای غیرقابل پیش‌بینی شود.

خواندن خارج از مرز (Out-of-Bounds Read)

این آسیب‌پذیری زمانی رخ می‌دهد که برنامه سعی می‌کند داده‌ای را از خارج از محدوده‌های معتبر حافظه بخواند.

مثال کد:

#include <iostream>

void outOfBoundsRead() {
    int array[5] = {1, 2, 3, 4, 5};
    std::cout << array[10] << std::endl;  // Reading out of bounds
}

int main() {
    outOfBoundsRead();
    return 0;
}

توضیح:

در این کد، برنامه سعی می‌کند از یک شاخص خارج از محدوده (۱۰) در یک آرایه با اندازه ۵ عنصر بخواند. این می‌تواند منجر به دسترسی به داده‌های غیرمجاز شود.

نوشتن خارج از مرز (Out-of-Bounds Write)

این آسیب‌پذیری زمانی رخ می‌دهد که برنامه سعی می‌کند داده‌ای را در خارج از محدوده‌های معتبر حافظه بنویسد.

مثال کد:

#include <iostream>

void outOfBoundsWrite() {
    int array[5] = {1, 2, 3, 4, 5};
    array[10] = 42;  // Writing out of bounds
}

int main() {
    outOfBoundsWrite();
    return 0;
}

توضیح:

در این کد، برنامه سعی می‌کند به یک شاخص خارج از محدوده (۱۰) در یک آرایه با اندازه ۵ عنصر بنویسد. این می‌تواند منجر به تغییر داده‌های حساس یا خراب شدن برنامه شود.


دیدگاه های مربوط به این مقاله (برای ارسال دیدگاه در سایت حتما باید عضو باشید و پروفایل کاربری شما تکمیل شده باشد)