Professional Documents
Culture Documents
مرداد 1396
مقدمه
هدف از تهیه این مستند ارائه راهکارهایی جهت تولید نرم افزار امن میباشد ،در این مستند به بررسی انواع آسیب پذیری ها و حمالت مطرح
نرم افزاری و همچنین راه کار های مقابله با آنها میپردازیم .در ابتدا به موضوعاتی مانند امنیت در سطح ، memoryدفاع در برابر حمالت سطح
پایین ،امنیت در وب ،طراحی و ساخت نرم افزار امن ،و در بخش های پایانی به آنالیز استاتیک ,و آزمون نفوذ سنجی pen testمیپردازیم.
مفهوم امنیت نرمافزار شامل حفاظت از سیستمهای عامل و برنامههای کاربردی سازمان از دستیابی غیرمجاز میباشد .منظور از دستیابی غیر
مجاز هرگونه سوء استفاده ،تغییرات و حذف عمدی یا غیرعمدی است .چنانچه در برنامهها یا نرم افزارها به اندازه کافی به مسائل امنیتی توجه شده
باشد ،رایانهها چه از جنبههای سختافزاری و چه از جنبههای نرمافزاری قابلیت محافظت از خود را دارند .رایانهها با اجرای چنین نرمافزارهای امنی از
خود و اطالعات ذخیره شده محافظت خواهند نمود و این امر نقش مهمی دراعمال شیوههای امنیتی مراکزی دارد که دارای سیستمهای رایانهای هستند.
هرچه برنامهها و سیستمها ،پیچیدهتر و بزرگتر باشند نیاز به اعمال شیوههای کنترل دسترسی و ایمنسازی نرمافزارها بیشتر احساس میشود.
گسترش روزافزون استفاده از رایانههای شخصی و دسترسی آسان به شبکههای رایانهای نیز ،بر ضرورت تهیه و اجرای برنامههایی که به نکات ایمنی
توجه الزم و کافی را مبذول داشته باشند ،میافزاید .معیارهای سنجش میزان ایمنی سیستم بایستی به گونهای طراحی شوند که اجزای سختافزاری
ونرمافزاری هر یک بطور جداگانه قابل بررسی باشند .طراحی صحیح نرمافزار در کنترل انواع اطالعاتی که کاربر مجاز است به آن دسترسی داشته
باشد ،نقش مهمی ایفا میکند.
فهرست مطالب
صفحه عنوان
. به مقصد مورد نظر خود هدایت میکنندPadding را با استفاده ازCPU در%eip ، »دستورالعمل هایی که به منظور «اجرای اسکریپت مخرب
1 3
به این.یک شیوهی سوء استفاده از امنیت رایانه است که به مهاجم اجازه میدهد در حضور راهحلهای دفاعی مانند امضای کد به اجرای کد مخرب بپردازد
.ترتیب که مهاجم کنترل فراخوانی پشته را به دست میگیرد و جریان کنترل برنامهها را میرباید و سپس دستورات ماشین مورد نظر خود را به اجرا درمیآورد
Hide the address of desired libc code or return address Brute force search (for 32-bit systems) or information
using ASLR leak (format string vulnerability)
Avoid using libc code entirely and use code in the Construct needed functionality using return oriented
program text instead programming (ROP)
Randomizing the location of the code (by compiling for Blind ROP
position independence) on a 64-bit machine makes 1.Read the stack to leak canaries and a return address
attacks very difficult 2.Find gadgets (at run-time) to effect call to write!
3.Dump binary to find gadgets for shellcode
Buffer Overflow 3-1
سرریز بافر ،هنگامی که برنامه در حال نوشتن دادهها به بافر است ،از مرز بافر تخطی میکند و باعث رونویسی حافظه مجاور میشود.
مراحل سر ریزی بافر به صورت کلی به شکل زیر میباشد:
قرار دادن کد مخرب در حافظه(بدون مقدار صفر)
پیدا کردن %eipو هدایت کردن آن به نحوی که کد مخرب اجرا شود
پیدا کردن آدرس بازگشت (حدس از طریق آدرس خام)
حمالت:
(Code Corruption ( 1تخریب کد(
(Control-flow Hijack ( 2ربایش جریان کنترل(
(Data-only Attack ( 3حمالت داده ای(
(Information Leak ( 4نشت اطالعات(
(Denial of Service / Availability ( 5منع خدمات(
در مبحث نرمافزار ،سرریز بافر پشته وقتی اتفاق میافتد که یک برنامه ،اطالعاتی را در آدرسی خارج از ساختمان داده مورد نظرش (معموالً بافری با اندازه
ثابت) که در پشته فراخوانی برنامه قرار دارد ،مینویسد .ظرفیت بافرهای با اندازه ثابت ،از قبل و در زمان کامپایل تعیین شده است و در صورتی که اطالعاتی
بیشتری در آنها نوشته شود ،سرریز خواهند شد و اینگونه باگها را بوجود خواهند آورد .اگر این بافر در پشته برنامه قرار داشته باشد ،ممکن است باعث بوجود
آمدن حمالت سرریز بافر پشته شود .نتیجه این عمل خراب شدن و آسیب دیدن اطالعات مجاور آن بافر در پشته است و در صورتی که این سرریز به طور
ناخواسته و بر اساس یک اشتباه بوجود آمده باشد ،اغلب یا باعث میشود که برنامه کرش کند یا اینکه به صورت نادرست رفتار کند .این نوع سرریز ،بخشی از
دسته بزرگتری از باگهای برنامهنویسی به نام سرریز بافر است.
اگر برنامهای که دچار سرریز بافر پشته شده ،با امتیازها و دسترسیهای باالیی اجرا شده باشد ،یا اگر برنامه اطالعاتی را از میزبانهای شبکه غیر قابل اطمینان
دریافت کند (همانند یک وب سرور) ،این باگ میتواند یک آسیبپذیری امنیتی بالقوه محسوب شود .اگر بافر موجود در پشته با اطالعاتی از طرف یک کاربر
غیر قابل اطمینان پر شود ،آن کاربر میتواند کدهایی با قابلیت اجرا شدن را در پشته برنامه تزریق کرده و سپس کنترل برنامه را در دست بگیرد .این نوع
حمله ،یکی از قدیمیترین و قابل اتکاترین حمالتی است که مهاجمین و خرابکاران از آن برای بدست آوردن دسترسی غیر مجاز به رایانه استفاده میکنند.
روشهایی برای مقابله با این نوع حمالت وجود دارد که از جمله آنها ،استفاده نکردن از توابعی همچون strcpyو getsاست .این توابع حدود بافر را بررسی
نمیکنند و امکان دارد در آدرسی خارج از محدوده بافر ،اطالعات را بنویسند.
STRCPY ⟹ STRLCPY
STRNCAT ⟹ STRLCAT
STRNCPY ⟹ STRLCPY راه های جلوگیری
SPRINTF ⟹ SNPRINTF
VSPRINTF ⟹ VSNPRINTF
GETS ⟹ FGETS
Stack canaries
MICROSOFT VERSIONS DIFFERENT Nonexecutable stack
STRCPY_S, STRCAT_S
STRCAT ⟹ STRLCAT
Randomization
استفاده از توابع امن به جای توابع خطرناک
On the heap 1-3-2
سرریز هیپ یک نوع سرریز بافر میباشد که در ناحیه دادههای هیپ ( )heapرخ میدهد .سرریز هیپ به شیوههای متفاوت بنابر سرریزهای مبتنی بر استک
بهره برداری (استخراج) میشود .حافظه در هیپ به صورت پویا در زمان اجرا توسط برنامه تخصیص داده میشود و به طور کلی شامل دادههای برنامه میباشد.
استثمار با تخریب کردن دادهها در روشهای خاص برای ایجاد برنامههای کاربردی به منظور بازنویسی ساختارهای داخلی مثل اشاره گر لیست پیوندی انجام
میشود .تکنیک سرریز هیپ استاندارد ،بر روی حافظه پویایی که به صورت پیوندی اختصاص داده میشود (مانند دادههای متا) رونویسی میشود و با استفاده
از نتایج معاوضه اشاره گر ،یک اشاره گر تابع برنامه را بازنویسی میکند.
یک مثال نمونه بر روی لینوکس این است که دو بافردر کنار یکدیگر بر روی هیپ اختصاص داده میشود .نوشتن فراتر از مرز اولین بافر اجازه میدهد که
دادههای متا را در بافر دوم بازنویسی کنیم .بیت مورد استفاده از بافر دوم را به صفر تنظیم میکنیم و طول را نیز به یک مقدار منفی که اجازه میدهد بایتهای
تهی ( )nullکپی شوند ،تنظیم میکنیم .وقتی که برنامه تابع )(freeرا بر روی بافر اول اجرا میکند ،آن تالش خواهد کرد که دو بافر را در یک بافر ادغام کند.
هنگامی که این اتفاق میافتد ،بافری که آزاد فرض میشود ،انتظار میرود که دو اشاره گر FDو BKرا در هشت بایت اول بافری که قبالً اختصاص داده شده
است نگه دارد .اشاره گر BKبه روی FDمینویسد و میتواند برای بازنویسی یک اشاره گر استفاده شود .به هر حال به دالیل مختلف این دیگر امکان پذیر
نیست.
حمالت:
Overflow into the C++ object vtable
Overflow into adjacent objects
Overflow heap metadata
در برنامهنویسی ،سرریز عدد صحیح هنگامی رخ میدهد که نتیجه یک عمل محاسباتی مقدار عددی بزرگی است که از محدوده مجاز قابل پردازش فراتر است.
مثالً افزودن عدد 1به بزرگترین عدد قابل نمایش سبب این نوع سرریز میشود ،و معمولترین نتیجهای که سیستم بروز میدهد کوچکترین عدد قابل نمایش
است (در انگلیسی به این رخداد اصطالحاً wraparoundمیگویند) .در برخی پردازشگرها مثل واحد پردازشگر گرافیکی و پردازشگر سیگنال دیجیتال نتیجه
به اشباع رسانده میشود ،یعنی وقتی به بزرگترین عدد برسیم ،نتیجه تالش برای بزرگتر کردن آن ،برگردانده شدن همان بزرگترین عدد قابل نمایش است.
طبق استاندارد ایزو سی 99سرریز عدد صحیح سبب «رفتار تعریفنشده» میشود ،این یعنی کامپایلرها میتوانند کامالً آن را نادیده بگیرند یا حتی برنامه را
متوقف کنند .اغلب کامپایلرها از این مشکل چشمپوشی میکنند ،و نتیجهای غیرمنتظره یا غلط برمیگردانند .سرریز عدد صحیح میتواند در حاالتی به سرریز
بافر منجر شود.
حمالت:
(Width\Type mismatch overflow ( 1عدم تطبیق اندازه /نوع)
(Arithmetic overflow ( 2سرریز محاسباتی)
(Signedness Bugs ( 3عدم تطبیق عالمت)
Format String Vulnerabilities 1-3-4
در برنامه نویسی سی برای چاپ یک استرینگ ،عدد یا یک کاراکتر از یک سری پترن های خاص استفاده می کنیم .
این پترن ها شامل استرینگ ، s%عدد صحیح d%و ...میباشد ،به عنوان مثال Printfاز جمله توابعی است که از محدوده استک تجاوز میکند و میتواند
باعث آشکار شدن اطالعات حساس گردد.
در صورتی که هنگام گرفتن خروجی پترن آنرا به ترتیبی که ذکر شد ،وارد نکنیم ،به ازای هر ورودی مقادیری از حافظه بصورت تصادفی بر میگرداند که
باعث نشد اطالعات حساس و کلید های رمز نگاری و ...میشود.
توابع آسیب پذیر عبارتند از vsnprintf ،vsprintf ،vprintf ،vfprintf ،snprintf ، sprintf ، printf ،fprint :
مثال در صورتی که مهاجم در قطعه کد زیر مقدار ” NAME = “%S%S%Sقرار دهد برنامه CRASHمیکند.
مثال در صورتی که مهاجم در قطعه کد زیر مقدار ”… NAME = “…%Nقرار دهد میتواند در MEMORYدرج انجام دهد که منجر به EXPLOIT
میشود.
!;)char *name = fgets(…, network_fd
printf(name);! // Oops
Dangling pointer 1-3-5
اشارهگر های معلق در زبانهای برنامه نویسسی اشاره گرهایی که به یک شی مشخص اشاره نمیکنند .شرایط مختلفی به وجود میاید که سالمت کد را به خطر
میندازد .اشارهگر معلق زمانی به وجود میآید که یک شی حذف یا آزادسازی میشود ،بدون اینکه مقدار یک اشارهگر تغییر داده شده باشد .در نتیجه آن
اشارهگر به مکانی اشاره میکند که دیگر وجود ندارد .حتی ممکن است سیستم مکان قبلی حافظه که ازاد شده بود را به فرایند دیگری داده باشد ،در این
صورت ان اشارهگر به دادهای متفاوت اشاره میکند .بیشتر زمانی این اتفاق میفتدکه برنامه سعی میکند دادههایی روی حافظه بنویسد .در این صورت ممکن
است برنامه اطالعاتی را تغییر میدهد و باعث بروز باگهایی در خود ان برنامه یا برنامه های دیگر شود که تشخیص ان کار سادهای نیست.
اشارهگر های معلق زمانی به وجود میایند که یک اشارهگر قبل از مقداردهی اولیه یک متغیر به وجود میاید .ممکن است در یک زبان برنامه نویسی این اتفاق
میفتد در این صورت احتمال خطایابی و رفع ان بیشتر میشود.
Make stack (and heap) non-executable Getting %eip to point to (and run) attacker code
Use Address Space Layout Randomization
Use Address-space Layout Randomization )Finding the return address (guess the raw addr
ASLR (Address space layout randomization) 4-2
یکی از روش های امنیت رایانه که شامل تنظیم تصادفی موقعیت مناطق اطالعات کلیدی است؛ مناطق کلیدی به مکان ذخیرهسازی کتابخانهها و پشتهها در
.فضای آدرس پردازش اطالق میگردد
در خیلی از برنامهها ابتدا یک شرط بررسی میشود و سپس از نتیجه. نام یک دسته از باگهای نرمافزاری است: زمان بررسی تا زمان استفادهTOCTOU
یک حفره، این عمل اتمی و تجزیهناپذیر نیست و بین زمان بررسی کردن یک شرط و زمان استفاده از نتایج آن.آن شرط در جای دیگری استفاده میشود
، در نتیجه، نتایج آن توسط یک رویداد خارجی تغییر کند، این حفره زمانی این امکان را ایجاد میکند که پس از بررسی کردن اولیه شرط.زمانی وجود دارد
. نوعی شرایط رقابتی است، این باگ. چرا که تغییر یافتهاند، آن نتایج دیگر معتبر نخواهند بود،وقتی که برنامه قصد استفاده از نتایج را دارد
Memory یافتن آسیب پذیری های6-2
) (ابزار دسترسی به آرایه ها برای بررسی سرریزها و خطاهای استفاده پس از آزاد شدن استAddress Sanitizer (ASAN) کامپایل با
. به کار میرودdebugging, memory leak, profiling ابزار برنامه نویسی که برای شناساییValgrind
Smart pointers
Pointers with only safe operations
Lifetimes managed appropriately
First in the Boost library, now a C++11 standard
Networking
For dealing with network-transmitted data
Ensures input validation, parsing, etc
Efficient
Secure Coding -3
امن سازی کد ،سبب توسعه نرم افزارهای کامپیوتری به گونه ای است که در مقابل آسیب پذیری های امنیتی ایمن باشد .نقص ها ،اشکاالت و خطاهای منطقی
به طور مداوم باعث آسیب پذیری های نرم افزاری می شوند .از طریق تجزیه و تحلیل هزاران آسیب پذیری گزارش شده ،متخصصان امنیتی متوجه شده اند
که بیشتر آسیب پذیری ها به دلیل تعداد کمی از خطاهای برنامه نویسی رایج میباشند .با شناسایی شیوه های برنامه نویسی ناامن که منجر به خطا می شوند
و آموزش توسعه دهندگان در مورد جایگزین های امن ،سازمان ها می توانند اقدامات پیشگیرانه ای را برای کاهش آسیب پذیری های نرم افزاری قبل از استقرار
یا حذف آنها انجام دهند .در ادامه بصورت موردی با برخی از این نکات آشنا میشویم:
vi , emacsدارای قابلیت اجرا کد از طریق shellمیباشند ،به همین خاطر توصیه میشود از ادیتور هایی با سطح دسترسی پایین تر مانند pico
استفاده نماییم.
در صورتی که فایل حساسی بر روی سایت وجود دارد ،بجای دانلود ،فقط بر روی مرورگر سیستم کاربر نمایش داده شود.
ایزوله نمودن اجزای سیستم به عنوان مثال استفاده از Seccompدر سیستم عامل لینوکس در صورتی که میخواهیم کد غیر قابل اطمینانی را باز کنیم.
Seccompبصورت فقط از توابع فراخوانی read, write, exit, sigreturnاستفاده میکند در صورتی که بخواهیم این توابع را بصورت
سفارشی نماییم از seccomp-bpfاستفاده نماییم.
استفاده از کد های امن شده ( )hardened codeمانند crypto libraries
( )(i >= 0 && i < a.length) ? a[i] : exit Haltingدر صورتی که محدوده آرایه بیش از حد مجاز بود ،متوقف شود)
هر tabمرورگر را در یک processجداگانه اجرا کنید ،بنابراین exploitationیک tabاز دسترسی به داده های tabدیگر امکان پذیر نمی
باشد.
اعتبارسنجی ورودی
به توابعی که دامنه پارامترهای آن محدود باشد اعتماد کنید (به عنوان مثال ،در محدوده یک بافر باشد) o
در صورت عدم وجود تگ <( >scriptو دیگر رشته های قابل تفسیر کد) ،به فرم فیلد کالینت اعتماد کنید o
به یک رشته کدگذاری توسط ( YAMLاگر حاوی کد نبود) اعتماد کنید o
لیست سفید objectsهای معتبر ،به جای لیست سیاه نامعتبر ،به عنوان مثال ،تصاویر را از منابع ناشناخته وارد نکنید
برای هر یک از ماژول ها ،پیش شرط های پیش بینی شده بصورت بدبینانه چک شود.
oحتی اگر شما "می دانید" کالینت یک اشاره گر NULLارسال نمی کنند ،بهتر است یک استثنا (یا حتی خروج) را اجرا کنید تا اینکه
کد مخرب اجرا شود.
Enforce input compliance
Use safe string functions
Don’t forget NUL terminator
Understand pointer arithmetic
Use NULL after free
Use goto chains to avoid duplicated or missed code
)Use safe string library (• Safety first, despite some performance loss) - Example: Very Secure FTP (vsftp
string library
Use a safe allocator (Windows Fault-Tolerant Heap (FTH): monitoring application crashes and autonomously
applying mitigations to prevent future crashes on a per application basis , DieHard: Probabilistic Memory
)Safety for Unsafe Languages
3-1تمرکز بر مرور ساز و کارهای مقابله با سؤاستفاده از آسیب پذیری های حافظه در زمان اجرا
Safe languages
Bounds checkers
Probabilistic countermeasures
Separators & Replicators of information
VMM-based countermeasures
Execution Monitors
Hardened libraries
Runtime taint checkers
http://web.mit.edu/Saltzer/www/publications/protection/Basic.html
• NIST for standards
• OWASP, CERT, Bugtraq for vulnerability reports
• SANS Newsbites for latest top threats
• Academic and industry conferences and journals for longer term trends, technology, and risks
برخی از تنظیمات و گزینه های قابل استفاده که بر امنیت سیستم تأثیر می گذارد
) بیتیRSA 2048 کلید های،• طول کلید پیش فرض امن است (به عنوان مثال
نمی تواند سیستم را بدون انتخاب یک رمز استفاده کرد:• عدم استفاده از رمز عبور پیش فرض
WEB امنیت در-4
. از سایت ما داشته باشد به روش های مختلفی آنرا تغییر میدهد و تست میکند تا آسیب پذیری را پیدا کندURL مهاجم در صورتی که
حمالت
SQL injection
Cross-site scripting (XSS)
Cross-site request forgery (CSRF)
Session hijacking
default passwords
Directory brute forcing
hidden files and directories
Authentication problems
Insecure web services
Configuration page gives away your root password
TCP SYN to port 443, TCP SYN/ACK to port 80 (Looking for running HTTPS or HTTP servers)
Nmap (sending raw IP packets into the network and observing the effects)
hosts o
services (application name and version) o
operating systems o
packet filters/firewalls are in use o
SQL حمالت
Tautologies
Illegal/Logically Incorrect Queries
Union Query
Piggy- Backed Queries
Stored Procedures
Inference
Alternate Encodings
. سبب پدیدار شدن آسیب پذیری میشود، هنگامی که مرز مشخصی بین کد و دیتا وجود نداشته باشد
Checking .1
) با رنج صحیحinteger چک کردن اینکه آیا ورودی های کاربر معتبر است (مثال: Whitelisting
Sanitization .2
Blacklisting
Escaping
Decouple the code and the data
Limit privileges
Encrypt sensitive data
Sanitization 4-1-1
: Blacklisting کاراکترهایی را که نمیخواهید را حذف کنید .مانند '؛ -
: Escaping کارکترهای مشکل ساز را با نمونه های ایمن جایگزین کنید
کارکترهای مشکل ساز کارکترهای ایمن
’ \’
; \;
- \-
\ \\
Javascript 8-4
حمالت مربوط به Javascript
)Alter page contents (DOM objects
)Track events (mouse clicks, motion, keystrokes
Issue web requests & read replies
)Maintain persistent connections (AJAX
Read and set cookies
Metasploit 10-4
. این نرمافزار امکان دسترسی به شل قربانی را به راحتی فراهم میکند.نرمافزار متا اسپلویت نرمافزار قوی برای نفوذ به سیستمها است
:) در کد ها میتوانیم از ابزار های زیر استفاده نماییمSymbolic execution( برای پیدا کردن اشکاالت امنیتی مهم
SAGE at Microsoft •
Mergepoint for Linux •
-6جمع بندی:
در این مستند ساختار برنامه نویسی امن ،بررسی تهدیدات و شیوه نوشتن کد امن را معرفی و در نهایت با راهکار های مقابله با این تهدیدات پرداختیم.
بصورت کلی 10موردی که میبایست در طول فرآیند تولید نرم افزار آنها را رعایت کنیم به شرح زیر میباشد:
-2به هشدارهای کامپایلی توجه ویژه داشته باشید (حتما از ابزارهای تحلیل ثابت و پویا ( STATIC AND DYNAMIC ANALYSIS
)TOOLSبرای کشف نواقص امنیتی بیشتر استفاده کنید).
-3معماری و طراحی را براساس خطمشیهای امنیتی انجام دهید ،سیستم را برپایه معماری امن ،پیادهسازی کنید ،که مجوزهای مختلف در
زمانهای مختلف کار کند ،ساختاری تفکیکی را برای ایجاد زیرسیستمهای مشخص و مجزا با سطوح دسترسی خاص اعمال کنید( .استفاده از اصول
و استاندارد ها که در فصل 3به آنها اشاره شده است )
-4ساده نگه دارید (پیچیدگی سبب به وجود آمدن آسیب پذیری می شود)
-5به صورت پیشفرض رد کنید ،به تمامی منابع داده ای خارجی (حتی در برخی موارد داخلی) ،مشکوک باشید ( پیشفرض « »DENYکنید و
در صورت نیاز به مجوز خاصی فقط آن دسترسی مورد نیاز را بدهید).
-6پایبند به اصل حداقل مجوز باشید (هرگونه اعطای مجوزی باید در حداقل ممکن واگذار بشه)
-9از روشهای تضمین کیفیت کارا استفاده کنید (آزمونهای فازی ،آزمون نفوذ ،بازبینی امنیتی کد)
-10از استانداردهای برنامهنویسی امن پیروی کنید (استفاده از اصول و استاندارد ها که در فصل 3به آنها اشاره شده است )