План за лекция 1 (основи на сигурното програмиране) 1) Цели на сигурното програмиране http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/security-principles.html 1.1. Конфиденциалност Много често информацията, която ни трябва, не трябва да бъде достъпна за външни лица. Това налага да имаме метод за ограничаване на достъпа (access control) 1.2. Цялост Трябва да сме сигурни, че данните, които имаме, са тези, които ни трябват, а не са подменени от лоши хора 1.3. Достъпност Колкото и да са защитени данните, ако нямаме достъп до тях, то и смисъла им се губи. 2) Основни принципи на сигурното програмиране 2.1. Сигурност на всеки слой, яснота на цялостната работа (обяснение на идеята за слоевете) Един от основните проблеми е неосъзнаването на цялата картина от програмиста. Той трябва да знае как точно комуникира с слоевете под и над него, и да предвиди сигурността при всяка от тези комуникации, както и ефектите от нея. т.е. трябва да е напълно наясно какво прави 2.2. Всичко трябва да е максимално просто, минимализация на привилегиите Всяко усложнение създава възможност за security проблеми. (трябват малко примери) 2.3. Пълна валидация и защита на данните (това май пасва на 2.1...) Ако приложението не проверява валидността и 'безопасността' на данните, които идват от неконтролирани от него места (т.е. не ги е генерирало то), то това почти сигурно води до проблеми. Също така е много важно за всеки проблем да се отбелязва в правилния log, т.е. да се дава информация за него. Ако не знаем, че се е появил проблем, няма как и да го решим. Също така важен е и момента с подправянето на самите данни по начин, който би бил трудно откриваем за обикновените им потребители и администриращите ги - за това контролните суми са важен момент за всички данни, които преминават през неконтролирана среда. 2.4. Paranoia is a Virtue http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/paranoia.html Както е казано много отдавна, don't be afraid to be paranoid. Един програмист трябва да има идеята за всички странни ситуации и случаи, в които програмата му може да се използва, и да помисли за метод за избягване на проблемите. 3) Основни подходи за атака 3.1. 'Странни' входни данни 3.2. Race conditions Пример с проверката за съществуване на файл и отварянето му като 2 отделни действия. 4) Разделение на езиците скриптови/интерпретируеми perl,php,shell script - основната им отличителна черта е, че използват външен интерпретатор. Самите скриптове се разпространяват в source вид. Предлагат някои сериозни удобства при повечето операции с прости структури, като стрингове, хешове и т.н. компилируеми c,c++ Компилират се до машинен код, което би трябвало да ги прави по-бързи. Те са единствения вариант при определен вид приложения, като firmware, или неща, които са оптимизирани директно за определен процесор. В повечето случаи проблемите идват от това, че програмистът трябва сам да се грижи за дребните детайли, и да си прави сам повечето работа с указатели, структури и т.н., както и че при дизайна на тези езици сигурността на е била вземана под внимание. Virtual machines Java, .NET (perl също използва виртуална машина, но не толкова явна, и не дърви файловете си в байткод. Знам, не е добра разлика...) Това са езици, чиито резултат строго се контролира от виртуална машина. Това спомага за спирането на голяма част от различните security проблеми, които имат компилируемите езици, като се появява нов клас такива, в самите виртуални машини. Също така имат и доста от проблемите на script езиците. 5) Неща, зависещи от операционната система Основно методите, чрез които можем да извлечем полза от даден проблем. Различни shell-ове, пътища към файлове, начини за добавяне на потребители, или просто код, който трябва да изпълним за някаква наша задача (пример със spamproxies)