Принципи в писането на сигурни програми - Минимални привилегии (Least privilege) Всяка програма трябва да се изпълнява или да изисква минималните привилегии, който ще и позволят да си свърши работата. Така при евентуална грешка последствията се намаляват. Ако са необходими повече привилегии при някоя операция е по-добре да се получат временно и след това да се откажат (минимално ползване на повишени права) - Простота на механизма (KISS) Дизайнът на програмата не трябва да е сложен. Сложността е враг номер едно на сигурното програмиране. - Отворен дизайн (Open design) Механизмите за защита не трябва да разчитат на това, че някой няма да знае как действат. Вместо това те трябва да разчитат на тайната на малко и лесно променяеми елементи (пароли, частни ключове). Разчитайки на затворен дизайн и на това, че никой няма да разбере как работи системата ще доведе до пробив в нея. Има декомпилатори, дизасемблери техники за reverse engeneering. - Проверявай винаги и всичко (Complete mediation) Всеки достъп трябва да минава през проверен канал. Освен това трябва да бъде проверяван на място, което не може да бъде избегнато. За пример при клиент сървър приложение, сървъра трябва да проверява достъпа до него а не да разчита, че клиента е проверил данните. Атакуващите могат да използват свой клиенти, който подават грешни данни. - Сигурни по подразбиране (Fail-safe defaults) По подразбиране трябва да се отказва услуга освен ако не е изрично разрешена. - Разделяне на привилегиите (Separation of privilege) В идеалният случай прескачането на една защита не трябва да води до пълен пробив в системата. - Намаляване на ползването на общи механизми (Least common mechanism) Намалете ползването на общи механизми (примерно общи временни директории). Споределените обекти често могат да доведат до подмяна на данни, на който сте вярвали правейки ги опасни. Методи за постигане на сигурна програма - Следвай основните принципи - Използвай прости и ясни интерфейси - Разделяй данните и контрола - Намали ползването на привилегии - Давай колкото са необходими - Ползвай ги колкото може по-малко - всеки компонент трябва да е с минимална функционалност и давърши само едно нещо - използвай сигурни стандартни настройки - никога не използвай вградени пароли! - зареждай стандартните настройки по сигурен начин - внимавай какво връщаш като грешки. При грешка която не би трябвало да се случва спри изпълнението на програмата - Избягвай race conditions - доверявай се само на проверени канали - настрой пътя за търсене на програми, на който вярваш - използвай код, който вътрешно проверява работата на програмата (assert) - ограничавай ресурсите, който са необходими - избягвай XSS (Cross-Site scripting) атаки - познавай специалните символи - филтрирай - използвай правилен encoding - Foil Semantic Attacks Атака при която атакуващият използва системата правилно но по някакъв начин заблуждава потребителя да си мисли, че прави нещо друго. Примери: http://www.bank.com@www.attacker.com/steal_cc - Внимавай с типовете данни, който използваш