در مبحث نرم افزار، سرریز بافر پشته ( به انگلیسی: Stack buffer overflow ) وقتی اتفاق می افتد که یک برنامه، اطلاعاتی را در آدرسی خارج از ساختمان داده مورد نظرش ( معمولاً بافری با اندازه ثابت ) که در پشته فراخوانی برنامه قرار دارد، می نویسد. ظرفیت بافرهای با اندازه ثابت، از قبل و در زمان کامپایل تعیین شده است و در صورتی که اطلاعاتی بیشتری در آن ها نوشته شود، سرریز خواهند شد و این گونه باگ ها را به وجود خواهند آورد. اگر این بافر در پشته برنامه قرار داشته باشد، ممکن است باعث به وجود آمدن حملات سرریز بافر پشته شود. نتیجه این عمل خراب شدن و آسیب دیدن اطلاعات مجاور آن بافر در پشته است و در صورتی که این سرریز به طور ناخواسته و بر اساس یک اشتباه به وجود آمده باشد، اغلب یا باعث می شود که برنامه کرش کند یا اینکه به صورت نادرست رفتار کند. این نوع سرریز، بخشی از دسته بزرگتری از باگ های برنامه نویسی به نام سرریز بافر است.
اگر برنامه ای که دچار سرریز بافر پشته شده، با امتیازها و دسترسی های بالایی اجرا شده باشد، یا اگر برنامه اطلاعاتی را از میزبان های شبکه غیرقابل اطمینان دریافت کند ( همانند یک وب سرور ) ، این باگ می تواند یک آسیب پذیری امنیتی بالقوه محسوب شود. اگر بافر موجود در پشته با اطلاعاتی از طرف یک کاربر غیرقابل اطمینان پر شود، آن کاربر می تواند کدهایی با قابلیت اجرا شدن را در پشته برنامه تزریق کرده و سپس کنترل برنامه را در دست بگیرد. این نوع حمله، یکی از قدیمی ترین و قابل اتکاترین حملاتی است که مهاجمین و خرابکاران از آن برای بدست آوردن دسترسی غیر مجاز به رایانه استفاده می کنند. روش هایی برای مقابله با این نوع حملات وجود دارد که از جمله آنها، استفاده نکردن از توابعی همچون strcpy و gets است. این توابع حدود بافر را بررسی نمی کنند و امکان دارد در آدرسی خارج از محدوده بافر، اطلاعات را بنویسند.
روش متداول برای سوءاستفاده از این باگ ها به این صورت است که مهاجم آدرس برگشت تابع را با اشاره گری به اطلاعات تحت کنترل خودش بازنویسی می کند ( این اطلاعات معمولاً در خود پشته قرار دارند ) .
#include < string. h> void foo ( char *bar ) { char c; strcpy ( c, bar ) ; // no bounds checking } int main ( int argc, char **argv ) { foo ( argv ) ; } کد بالا، آرگومانی را از خط فرمان دریافت کرده و آن را در یک متغیر محلی به نام c که در پشته برنامه قرار دارد، می نویسد. اگر آرگومانی که در خط فرمان وارد می شود کوچکتر از 12 باشد، این برنامه به درستی کار خواهد کرد. با این حال، اگر آرگومان بزرگتز از ۱۱ کاراکتر باشد، باعث می شود بافر c سرریز شود ( در زبان سی در انتهای رشته ها یک کارکتر null قرار می گیرد، بنابراین حداکثر اندازه ایمن برای این بافر ۱۱ است تا یک خانه هم برای آن کاراکتر null مهیا شود ) . اگر آرگومان خط فرمان ۱۲ کاراکتر باشد، برای ذخیره آن به بافری با اندازه ۱۳ نیاز است ( هم خود آرگومان و هم کاراکتر null ) . از آنجا که بافر c تنها ۱۲ کاراکتر ظرفیت دارد، باعث می شود تا کاراکتر null در خارج از محدوده بافر نوشته شود و یک خانه آن طرفتر را بازنویسی کند.
این نوشته برگرفته از سایت ویکی پدیا می باشد، اگر نادرست یا توهین آمیز است، لطفا گزارش دهید: گزارش تخلفاگر برنامه ای که دچار سرریز بافر پشته شده، با امتیازها و دسترسی های بالایی اجرا شده باشد، یا اگر برنامه اطلاعاتی را از میزبان های شبکه غیرقابل اطمینان دریافت کند ( همانند یک وب سرور ) ، این باگ می تواند یک آسیب پذیری امنیتی بالقوه محسوب شود. اگر بافر موجود در پشته با اطلاعاتی از طرف یک کاربر غیرقابل اطمینان پر شود، آن کاربر می تواند کدهایی با قابلیت اجرا شدن را در پشته برنامه تزریق کرده و سپس کنترل برنامه را در دست بگیرد. این نوع حمله، یکی از قدیمی ترین و قابل اتکاترین حملاتی است که مهاجمین و خرابکاران از آن برای بدست آوردن دسترسی غیر مجاز به رایانه استفاده می کنند. روش هایی برای مقابله با این نوع حملات وجود دارد که از جمله آنها، استفاده نکردن از توابعی همچون strcpy و gets است. این توابع حدود بافر را بررسی نمی کنند و امکان دارد در آدرسی خارج از محدوده بافر، اطلاعات را بنویسند.
روش متداول برای سوءاستفاده از این باگ ها به این صورت است که مهاجم آدرس برگشت تابع را با اشاره گری به اطلاعات تحت کنترل خودش بازنویسی می کند ( این اطلاعات معمولاً در خود پشته قرار دارند ) .
#include < string. h> void foo ( char *bar ) { char c; strcpy ( c, bar ) ; // no bounds checking } int main ( int argc, char **argv ) { foo ( argv ) ; } کد بالا، آرگومانی را از خط فرمان دریافت کرده و آن را در یک متغیر محلی به نام c که در پشته برنامه قرار دارد، می نویسد. اگر آرگومانی که در خط فرمان وارد می شود کوچکتر از 12 باشد، این برنامه به درستی کار خواهد کرد. با این حال، اگر آرگومان بزرگتز از ۱۱ کاراکتر باشد، باعث می شود بافر c سرریز شود ( در زبان سی در انتهای رشته ها یک کارکتر null قرار می گیرد، بنابراین حداکثر اندازه ایمن برای این بافر ۱۱ است تا یک خانه هم برای آن کاراکتر null مهیا شود ) . اگر آرگومان خط فرمان ۱۲ کاراکتر باشد، برای ذخیره آن به بافری با اندازه ۱۳ نیاز است ( هم خود آرگومان و هم کاراکتر null ) . از آنجا که بافر c تنها ۱۲ کاراکتر ظرفیت دارد، باعث می شود تا کاراکتر null در خارج از محدوده بافر نوشته شود و یک خانه آن طرفتر را بازنویسی کند.
wiki: سرریز بافر پشته