Сигурност като изискване
Накратко: Функционалните тестове проверяват какво може клиентът. Сигурността пита какво НЕ трябва да може човек, който иска да навреди. Затова изискването за сигурност се пише като сценарий със злонамерен потребител: кой, какво опитва и какво трябва да се случи вместо това.
Проблем
Всички тестове минават, а поръчките са на всички
Клиент отваря поръчката си: адресът завършва на /orders/1042. От любопитство сменя числото на 1041. Вижда чужда поръчка: име, адрес, телефон, какво е купено.
Магазинът има 400 теста. Един от тях проверява, че клиентът вижда своята поръчка. Минава. Никой тест не пита дали вижда и чуждата, защото никое изискване не казва, че не трябва.
Идеята
Сигурността е изискване като всяко друго
В модела на качеството от първия модул сигурността (security) е една от деветте характеристики. Тя е колко добре системата пази данните и действията от хора, които нямат право. ISO/IEC 25010:2023 я дели на шест:
| Подхарактеристика | В магазина |
|---|---|
| Поверителност (confidentiality) | Клиентът вижда само своите поръчки. |
| Цялост (integrity) | Цената не може да се смени от браузъра. |
| Неотменимост (non-repudiation) | Клиентът не може да твърди, че не е поръчал платената поръчка. |
| Отчетност (accountability) | Всяка смяна на адреса се записва: кой и кога. |
| Автентичност (authenticity) | Влязлият е този, за когото се представя. |
| Устойчивост (resistance) | Магазинът издържа на 10 000 опита за промо код в минута. |
Изискването за сигурност се пише и приема като всяко нефункционално: с поведение, което може да се провери, и с граница.
По-точно, за любопитните
Устойчивостта (resistance) е нова в изданието от 2023 г.: способността да се изпълнява работата и по време на атака. ISO/IEC 25010 описва какво се иска, не как се постига. Как се постига (пароли, сесии, токени, недоверен вход), е в модула Сигурност за програмисти от курса по софтуерно инженерство, с код.
Пробвай
Коя част от сигурността?
Идеята
Злонамереният потребител
Сторито казва какво иска честният клиент. Сигурността пита за друга роля: човек, който иска да навреди. Затова за всяко стори се пише и обратното:
- стори: „Като клиент искам да виждам поръчките си“;
- злонамерен сценарий (abuse case): „Като злонамерен клиент искам да видя чужда поръчка, за да взема адреса и телефона“.
Вторият казва какво не трябва да може да стане и какво се случва вместо това. Пише се със същите думи като критериите за приемане:
# language: bgФункционалност: Поръчките на клиента
Сценарий: Клиент не вижда чужда поръчка Дадено клиент А е влязъл в профила си И поръчка 1041 е на клиент Б Когато клиент А отвори поръчка 1041 То вижда „Няма такава поръчка“ И не вижда името, адреса и телефона на клиент Б И опитът е записан в журнала„Няма такава поръчка“, а не „Нямаш право“: второто казва на нападателя, че поръчката съществува.
По-точно, за любопитните
На английски се срещат и двете имена: abuse case и misuse case, по „Misuse cases“ на Синдре и Опдал (2005). OWASP поддържа списъци с типични атаки и с проверими изисквания за сигурност на уеб приложения (Application Security Verification Standard, ASVS). Нарушеният контрол на достъпа, като чуждата поръчка тук, е на първо място в OWASP Top 10 в изданието от 2021 г.
Пробвай
Какво не трябва да може?
Идеята
Кой мисли като нападател
Злонамерените сценарии не са работа само на екип по сигурност накрая. Най-евтино се намират на същия разговор, на който се пишат правилата на сторито. На Example Mapping към правилата, примерите и въпросите се добавя още един въпрос: „Кой би искал да злоупотреби с това, и как?“
- промо кодът: две платени поръчки едновременно; налучкване на кодове;
- връщането: чужда поръчка; връщане на по-скъп продукт от купения;
- количката: цена, сменена в браузъра; отрицателно количество.
Рискът подрежда кои да се напишат първи: тези, при които се губят пари или лични данни.
Приемането е както при производителността: изискванията се договарят с бизнеса предварително, а проверката им е част от приемното тестване. Тестът за проникване (penetration test) от външни хора е полезно допълнение. Но той намира това, което никой не е поискал. Изискването прави сигурността нещо, което се проверява всеки път.
По-точно, за любопитните
CT-AcT v1.0, глава 4, включва и сигурността в приемното тестване на нефункционалните изисквания: изискванията и мерилата се договарят предварително, а бизнесът решава кои рискове приема. Как моделът на заплахите се прави систематично (например STRIDE) и как атаките се проверяват с код, е в модула „Сигурност за програмисти“.
Упражнение
Изискване за сигурност
1. Поръчките. Рецензирай изискването за сигурност на поръчките.
Отбележи проблемите в изискването и избери вида на всеки.
Натисни думите, които са проблем; отново, за да махнеш отметката. Със стрелките се минава от дума на дума.
Проблемите в текста
- „защитен от хакери“ непроверимо: От кои атаки и как се проверява? Изискването трябва да назове заплахата и поведението: „клиент не вижда чужда поръчка, дори ако смени номера в адреса“.
- „оторизирани потребители“ двусмислено: Кои са оторизирани за коя поръчка? Клиентът само за своите, складът за всички платени, поддръжката само за прочит? Без това всеки влязъл може да се окаже „оторизиран“.
- „криптирани с AES“ решение вместо нужда: Това е решение, и при това грешно: паролите не се криптират, а се пазят с бавен hash със salt. Нуждата е „паролата не може да се извади от базата, дори ако някой я открадне“.
Последното изречение е добро изискване: поведение и какво се записва. Първото е пожелание. Второто не казва кой е оторизиран за коя поръчка, а точно там беше дупката с номера в адреса. Третото е решение, и то грешно: паролите не се криптират, а се пазят с бавен hash.
Тест
Провери се
Свързани уроци
Раздел „Свързани уроци“- Нужно отпреди: Критерии за приемане · Нивата на тестване · Видовете тестване · План и тестване по риск
- Задачи по темата: Нефункционално