Нека да си представим, че годината е 1997, по радиото звучи хита на сър Елтън Джон "Candle in the Wind" (имаше и по-лоша възможност - "Wannabe" на Spice Girls). На CRT мониторът е десктопа на Windows 95 Plus! и е пуснат Pinball. Животът е по-спокоен, разполагаме с повече свободно време и в ръцете ни е текста на основополагащата статия за идеологията на отворения код - "Катедралата и базарът" на Ерик Реймънд.

В нея Реймънд дефинира 19 важни урока, свързани с разработката на софтуер:

  1. Всеки добър софтуер е започнат заради личните прищевки на някой програмист.
  2. Добрите програмисти знаят какво да напишат. Наистина великите знаят какво да пренапишат (и използват).
  3. Планирай да изхвърлиш нещо – тъй или иначе ще се наложи.
  4. Ако човек има правилното отношение към нещата, интересните проблеми сами ще го намерят.
  5. Когато човек загуби интерес към една програма, последното му задължение към нея е да я предаде на достоен наследник.
  6. Да смятате потребителите за ваши партньори е най-лесният път към бързо подобрение на кода и ефективно откриване на грешки.
  7. Пуснете програмата рано. Пускайте нови версии често. И слушайте клиентите си.
  8. При достатъчно голяма база от бета-тестери и разработчици почти всеки проблем щe бъде бързо открит, и решението му ще бъде очевидно за някого.
  9. Комбинацията от добра структура на данните и тъпичък код работи по-добре от обратното.
  10. Ако се отнасяте към бета-тестерите си като към вашия най-ценен ресурс, те ще ви отвърнат като станат най-ценния ви ресурс.
  11. Освен да имате добри идеи, трябва да можете да разпознавате добрите идеи на вашите потребители. Понякога последното е по-важно.
  12. Често най-изненадващите и новаторски решения се получават, когато човек осъзнае, че концепцията му за проблема е грешна.
  13. Съвършенство (в проектирането) не се постига, когато няма какво да се добави, а когато няма какво повече да се махне.
  14. Всеки инструмент трябва да върши работата, за която е предназначен, но един наистина добър инструмент може да се използва за неща, за които не сте и предполагали.
  15. Когато пишете междинна програма от какъвто и да е вид, старайте се да променяте потока данни колкото може по-малко – и никога не изхвърляйте информация, освен ако получателят не ви накара.
  16. Ако правите език, който далеч не е еквивалентен на машина на Тюринг, може да си позволите разточителство в синтаксиса му.
  17. Една система за защита е сигурна само докато остава в тайна. Пазете се от псевдо-тайни.
  18. За да решите интересен проблем, започнете оттам да намерите проблем, който ви е интересен лично на вас.
  19. При условие, че координаторът на разработката има среда, добра поне колкото Интернет, и знае как да ръководи, без да принуждава, много глави са неизбежно по-добре от една.

Предполагам, се замисляте - какво е общото между "Катедралата и базарът" и киберсигурността? Нека да погледнем по-глобално (не да задълбаем в техническите аспекти) и акцентираме върху някои от уроците.

Всеки добър софтуер е започнат заради личните прищевки на някой програмист.

Обърнете внимание на думата "добър". За съжаление в момента има много софтуер, който е започнат заради печалба или само да се покрие дадена ниша. Отворете Application Store на вашия смартфон, и потърсете приложение за сканиране на мрежи. При условие, че функционалността е почти идентична, кое е най-доброто, кое е най-бързото, в кое няма spyware, кое е безплатно, кое е най-лесно за употреба?

Често, когато е открита дадена пазарна ниша, в която е възможно да се реализира софтуерно решение се бърза с неговото разработване и пускане в употреба, а причините са прости - да се изпревари конкуренцията, да се спазят срокове и/или да се получи финансирането за него.

Не казвайте, че не сте попадали на сайтове, пълни с бъгове или, че приложение не е блокирало точно преди да запишете важен за вас файл, по който сте работили часове наред. Точно тези грешки на програмистите, а и фактът, че приложенията започват да стават по-сложни, са предпоставка за редица успешни кибератаки, кражба на данни, DoS и други.

Много от инструментите за анализ на сигурността стартират като проекти с отворен код, ръководени от разработчика, чиято идея се реализира и голяма част от тях бързо набират популярност и привличат други програмисти и специалисти.

Добрите програмисти знаят какво да напишат. Наистина великите знаят какво да пренапишат (и използват).

Тук може да разгледаме многото библиотеки и "framework", които са налични в момента за разработката на специални инструменти за тестване на сигурността и за атаки. Предполагам, че сте чували за Metasploit Framework - система от модули, която по същество предоставя функции за мрежова комуникация, проверка за отворени портове, създаване и обфускиране на shell code и други. Разработените модули (скриптове), базирани на MSF често се използват при pen-testing, но и при злонамерени атаки. Самото създаване на скрипта е изключително лесно, благодарение на употребата на езика Ruby, простите структури от данни, функциите и добрата документация. Това дава на злонамерените лица гъвкави възможности за бързо създаване на код, ескполатиращ новооткрита уязвимост.

... а MSF не е единствената подобна разработка.

От друга страна, ако в един "framework" или библиотека има технологични пропуски, това поставя в риск приложенията, които ги използват, но това е нещо, което в момента трудно може да се избегне, поради концепцията за разработка на софтуерни продукти. Много малко са приложенията, не-използващи споделени програмни ресурси.

Когато човек загуби интерес към една програма, последното му задължение към нея е да я предаде на достоен наследник.

Тук малко може да променим урока. Нека да приемем, че става въпрос, не за загуба на интерес, а за нежелание за поддръжка и предаване на това действие на трета страна.

В последните седмици всички медии ни заливат с информация, анализи и теории за изтеклите лични данни от системите на НАП, които се оказа, че са сравнително стари (системите) и не са били поддържани. Ето го и болезненият пример.

Аналогична е ситуацията с много IoT устройства, чиито управляващ софтуер (firmware) няма по-нова версия, не се придвижва нейно разработване, но за сметка на това има налични уязвимости. Тук се замислих, дали в един момент, аналогично на "DLL hell", няма да заговорим за "IoT hell".

Да смятате потребителите за ваши партньори е най-лесният път към бързо подобрение на кода и ефективно откриване на грешки.

За съжаление, в момента потребителите масово не се разглеждат като партньори, а като източник на финансиране. Това не важи за много проекти с отворен код, но за комерсиалния софтуер е в сила.

От гледна точка на киберсигурността и подобряването на кода може да споменем и честата липса на политика за отговорно споделяне (Responsible Disclosure Policy). Една примерна ситуация- изберете онлайн система у нас, без значение, дали е на държавна структура или на частна компания. Приемете, че сте открили изключително сериозен проблем в сигурността и и искате да го споделите (отговорно) с администраторите. Погледнете, дали някъде на сайта има публикувана подобна политика. Именно липсата на такава затруднява изпращането на информацията към засегната страна, защото не е ясно какъв ще бъде отговора и реакцията. Тази информация е изключително важна за подсигуряване на системите и нейното навременно оповестяване може да се окаже решаващо за спиране на изтичане на данни или други атаки.

Пуснете програмата рано. Пускайте нови версии често. И слушайте клиентите си.

Познати принципи от концепцията Agile и по-точно "Extreme Programming". В това няма нищо лошо, стига в бързането да не се допускат грешки, водещи до уязвимости, но това често се случва.

Относно новите версии, лично аз обичам да получавам нова функционалност на използваните от мен продукти и често инсталирам или обновявам до най-актуалната версия, възможно най-бързо. За съжаление това е нож с две остриета, защото има не един или два случая, при които обновяванията водят до проблеми. Като пример може да посочим версията на Windows 10, която изтриваше потребителски файлове при своето обновяване.

https://www.howtogeek.com/fyi/microsoft-pulls-the-windows-10-october-2018-update-for-deleting-files/

Статистиката за CVE, свързани с Windows 10 ясно показва, че след пускането на първата версия на тази операционна система броят на откритите пропуски нараства:

https://www.cvedetails.com/product/32238/Microsoft-Windows-10.html?vendor_id=26

Видовете уязвимости са:

В горните числа и в тренда няма нищо изненадващо. Нормално и очаквано е с повишаване на сложността на дадена софтуерна система да се увеличи и шанса за наличие на уязвимости. Не, не се опитвам да защитя Microsoft, просто констатирам факт. Аналогично е и при други операционни системи, например за същия период от време в дистрибуцията Redhat са открити следните пропуски:

https://www.cvedetails.com/vendor/25/Redhat.html

При достатъчно голяма база от бета-тестери и разработчици почти всеки проблем щe бъде бързо открит, и решението му ще бъде очевидно за някого.

Този урок е много верен и се отнася с пълна сила за софтуера с отворен код, но при затворените разработки често пъти бета тестването е по-трудно, а откриването и решаването на проблема се свежда до QA и разработчиците.

От гледна точка на киберсигурността, това отново е предпоставка за наличие на уязвимости, които трудно се откриват и водят до "zero days".

Тестването на софтуерните решения е от съществена  важност и то трябва да се извърши не само за функционалност, но и за защита на данните. Тук се сещам за две много хубави книги на Microsoft - "Code Compete" и "Writing Secure Code". Определено втората покрива една важна част от създаването на код - не само ка да го напишем да е четим, добър и сравнително оптимален, но и да е сигурен. Въпреки, че не съм правил проверка, дали тази тема се изучава в университети и курсове за програмисти, съм сигурен, че на нея не се обръща необходимото внимание (освен в частта за WEB приложения).

Да допълним горе написаното - замислете се коя е основната причина за наличието на възможност за "Blind SQL Injection"?

Комбинацията от добра структура на данните и тъпичък код работи по-добре от обратното.

В урокът много ми допада терминът "тъпичък".

Всички знаем принципа KISS - "Keep It Smart and Simple". От инженерна гледна точка простите решения работят по-надеждно, а и много по-често и по-добре от една комплексна система. Тук отново усложняването на кода, неговите функции и зависимости води до много проблеми със сигурността.

Интересна е публикацията "Insecure example code leads to insecure production code", където са обобщени резултати от проучване - през 2017 г. са анализирани 64,415 бази от код в GitHub и ръчна проверка е потвърдила, че има 117 еднакви фрагмента с програмен код, директно копиран от пример (tutorial), в който има уязвимости (с две думи - лош пример). Сещам се за вица - "Не знам, дали съм програмист или само търся в Google. копирам и пействам...".

Освен да имате добри идеи, трябва да можете да разпознавате добрите идеи на вашите потребители. Понякога последното е по-важно.

Много от инструментите за проверка на сигурността се базират на отворен код, а техните потребители споделят редица идеи (добри, лоши и странни). Именно тази идеология позволява тяхната функционалност да се разширява и подобрява с всяка нова версия, а в духа на предходните уроци - да се откриват и отстраняват грешките.

Като пример може да посочим Metasploit, и потребителите, развиващи кода (т.нар. contributors). На графиката са показани данни за последния един месец:

https://github.com/rapid7/metasploit-framework/pulse/monthly

Всеки инструмент трябва да върши работата, за която е предназначен, но един наистина добър инструмент може да се използва за неща, за които не сте и предполагали.

https://xkcd.com/538/

Повечето специализирани инструменти за проверка на сигурността са концентрирани върху даден метод, уязвимост или са създадени да решат конкретна задача.

Нека да вземем за пример вездесъщият Wireshark. Основната му функционалност е анализ на мрежови трафик и с това се справя повече блестящо, но какви са неговите разширени възможности? От експортиране на обекти от HTTP сесии, през анализ и прослушване на VoIP обаждания, създаване на правила за защитни стени до декодиране на WiFi сесии. Сигурен съм, че ще се намери и някаква функционалност, за която и вие и аз не сме предполагали (вижте "5 Killer Tricks to Get the Most Out of Wireshark").

Когато пишете междинна програма от какъвто и да е вид, старайте се да променяте потока данни колкото може по-малко – и никога не изхвърляйте информация, освен ако получателят не ви накара.

В това правило ми направи впечатление изразът "не изхвърляте информация".

Изтриването на данни, може да се окаже сравнително трудно, когато дадена информация трябва да бъде заличена без възможност за възстановяване.

От гледна точка на киберсигурността има редица примери за изтичане на данни, базирани именно на възстановени файлове, не-нулирани области в паметта, където са били байтовете на криптографски ключове и др.

Идеята да не се "изхвърля информация" е добра, но трябва да се вземат необходимите мерки за нейната защита.

Една система за защита е сигурна само докато остава в тайна. Пазете се от псевдо-тайни.

Ще цитирам министъра на финансите Владислав Горанов - "Ако Националната агенция за приходите (НАП) не предлагаше електронни услуги, нямаше да има казус с изтичане на лични данни.".

... без думи ...

Ако една система се пази в дълбока тайна и достъпа до нея е силно ограничен, то вероятността за атаки, насочени към нея е по-малка. Предизвикателство е нещо да остане скрито в интернет, но въпреки това съществува и такава вероятност.

От друга страна злонамерените лица често използват т.нар. DarkWeb за своите разработки и за комуникация.

За да решите интересен проблем, започнете оттам да намерите проблем, който ви е интересен лично на вас.

Именно решаването на интересни проблеми е една от движещите сили при разработването на инструментите за анализ на сигурността и при откриването на начините за експлоатиране на дадени технологични пропуски.

При условие, че координаторът на разработката има среда, добра поне колкото Интернет, и знае как да ръководи, без да принуждава, много глави са неизбежно по-добре от една.

Интернет, отвореният код и колаборацията са изключително важни за киберсигурността. Освен разработката на инструменти глобалната мрежа се използва и за разнородни атаки - от DDoS до APT. Веднага може да посочим действията на хактивистите, които често внимателно подготвят и организират дадена операция и привличат много "script kiddies" за нейното осъществяване.

Обратно в днешни дни...

Нека да се върнем в началото на публикацията. Представете си, че CRT мониторът вече е 32" с 4K резолюция, десктопа е на Windows 10, работим по 5 задачи едновременно и се опитваме да отговорим в чатовете на смартфона. Спокойствие ... какво беше това? Сложност на софтуера ... висока. Свързаност ... глобална.

Софтуерните системи са изключително комплексни и тяхната сложност ще се увеличава с всяка нова версия, технология и поколение, а това ще води до нови уязвимости, атаки и методи за превенция от тях. Намираме се в един нормален кръговрат на техническата еволюция - в даден момент от време средствата за защита могат да изпреварят злонамерените инструменти и подходи и след това да стане обратното.

Важно е, че базарът и по-точно идеологията на отворения код ще се използва в гореописания цикъл - колаборацията, откриването на уязвимости, разработката на инструменти и софтуерни продукти ще продължи аналогично на текущите проекти.

Ще има успешни DoS атаки и изтичане на данни (дори при спиране на всички е-услуги, което би успокоило министър Горанов), но не е ли подобна ситуацията на базара - винаги ще има някои, който цели да ограби посетителите и такива, чиито вещи и пари са се оказали, без тяхно знание и позволение в нечии чужд джоб, винаги ще има измамени с качеството и количеството на закупената стока и винаги ще може да се намери нещо ново и интересно.

P.S. За тези, които не са виждали култовия Pinball при Windows 95 ето и screenshot от него:

https://www.reddit.com/r/nostalgia/comments/9yuzp4/windows_95_pinball/