secure coding guidelines
Овај водич објашњава безбедно кодирање, како избећи рањивости повезане са безбедношћу и пружа смернице за кодирање и листу за проверу сигурног кодирања:
Да би сигурност била уграђена у софтвер и да би се примениле смернице и најбоље праксе безбедног кодирања, целокупна организација, заједно са тимом који је идентификован за рад на планираном развоју апликација, мора узети у обзир одређене аспекте.
Овде ћемо разговарати о оним аспектима који помажу у развоју безбедног софтвера.
То је тако једноставно ако програмер не зна шта се подразумева под тим „Безбедност софтвера“ и како хакер може да хакује њихов софтвер, преузме контролу над њим и покуша да га искористи, онда је једноставно немогуће кодирати сигуран софтвер. Дакле, програмер прво мора да разуме значење сигурног кодирања.
Шта ћете научити:
- Шта је сигурно кодирање?
- Смернице за сигурно кодирање
- Контролна листа за праксе сигурних кодова
- Закључак
Шта је сигурно кодирање?
Сигурно кодирање је дизајнирање и развој софтвера до избегавање слабости који воде рањивостима везаним за безбедност придржавањем наведених безбедносних стандарда и најбољих пракси у индустрији.
Прво питање које се намеће свима у мислима је „Колико је сигурности потребно за наш софтвер“ или Када можемо рећи да је наш софтвер заштићен? и Који су то сигурносни стандарди ?
Преваре и претње безбедности повећавају се из дана у дан и видимо нове врсте и начине хаковања, чак и у такозваном најсигурнијем софтверу.
Недавно смо чули како се УИДАИ-ов програм Ааадхар петља у личне податке. Стога је заиста тешко знати колико је сигурности потребно за софтвер и који су сигурносни стандарди, осим ако не разумемо претње које су укључене у софтвер и не одредимо их према приоритетима на основу ризика по пословање.
Можда ће бити тешко обезбедити 100% безбедносну заштиту софтвера, али ако програмски тим анализира Ризици и хартије од вредности који су укључени у њихов софтвер, тј. потенцијалне претње и ако тим може да се побрине за ублажавање тих ризика, то би било добро са безбедносне тачке апликације.
Стога је први задатак тима да идентификује и анализира ризике и хартије од вредности који су укључени у њихову примену и разуме могуће опције ублажавања и у складу с тим усвоји најбољу опцију.
Дакле, једном идентификованих десет главних рањивости класификују готово све нападе са којима ће се програм вероватно суочити. Ово ће помоћи да се схвате претње и да се напори у погледу безбедности и развоја дају приоритету више превенцији него ублажавању.
најбољи бесплатни оптимизатор за Виндовс 7
На пример. Иако планирамо да развијемо здравствену апликацију која обрађује и складишти здравствене податке појединца и њихове личне податке, највећи безбедносни ризик за апликацију је крађа личних здравствених података.
Ублажавање ризика
Да бисте ублажили ризик,
- Имплементацијом сигурности приступа подацима од стране неовлашћеног корисника мора се руковати уз одговарајућу потврду идентитета и ауторизацију (јаке примене смерница лозинке, 2 фактора потврде идентитета).
- Потребно је водити рачуна о томе да током преноса података из једног у други извор не дође до цурења података применом заштићених канала (ХТТПС) преноса података и применом шифровања података током транзита.
- Неовлашћено мешање или крађа података је такође друга могућност. Стога је чување личних здравствених података (коришћење шифрирања) веома битно.
Пре него што одете на „Стандард за сигурно кодирање“, увек је боље да цео програмски тим има „Сесија свести о безбедности“ и разговарати и мозгати о томе,
- Захтев за сигурношћу њиховог специфичног производа.
- Могуће користи које би хакер имао хаковањем њиховог система.
- Могући начини и средства безбедносних компромиса њихове примене.
- Уследиле су уобичајене безбедносне праксе у сличној индустрији и домену.
- Разумевање типичних безбедносних проблема њихових програма.
Такође помаже тиму да се боље снађе, ако могу да разумеју Извори рањивости са којим се њихов софтвер може суочити и разлози због којих је софтвер изграђен Лоше / Неадекватно Сигурност .
Разлози за неадекватну примену безбедности
Генерално, следе неколико разлога за неадекватну примену безбедности у апликацији.
- Приоритет се даје функционалном издању него безбедносним аспектима.
- Незнање или незнање о сигурности софтвера и хакерима.
- Нема довољно јасноће у вези са програмом или самим дизајном софтвера.
- Сложеност програма.
- Нема довољно података, информације о активном систему где ће се применити.
- Без разматрања сигурности у СДЛЦ фазама.
- Недовољно знање и разумевање специфичности језика који се користи у софтверу.
- Нема довољно знања за тим и програмере о смерницама за безбедно кодирање.
Знамо да нису сви програмери и тестери свесни безбедности апликације и можда неће имати дубље разумевање безбедносних пропуста и експлоатација, посебно апликације на којој би радили. Генерално, они ће бити упознати са, „Како функционално кодирати“ али не знају сви „Како сигурно кодирати“.
Отуда је врло важан аспект за организацију да усвоји праксе сигурног кодирања у свом софтверу прво „Обучи људе“ . Дакле, обука њиховог тима о аспектима сигурног кодирања, најбољим праксама сигурносног кодирања и правилној употреби алата је веома важна.
Најважнији принцип дизајна софтверске сигурности је да „Имплементирајте сигурност дизајном и подразумевано“ .
Смернице за сигурно кодирање
Да бисте постигли сигурност, веома је битно да имате „Стандард сигурног кодирања“ идентификован за програм на самом почетку развоја апликације, а ово помаже тиму да се брине о безбедним подразумеваним вредностима за софтвер и помаже у заштити од напада.
Неопходно је осигурати да цео тим јесте Присиљени да се придржавају овог стандарда , без обзира на језик кодирања и алате које користе у програму.
У наставку је дато неколико примера које треба подразумевано применити у дизајн сигурног кода:
- Приступ би требао бити ограничен само на кориснике са аутентикацијом, а аутентификацију треба имплементирати на сваком слоју.
- Канали комуникације морају бити шифровани да би се заштитили токени за потврду идентитета.
- Сви кључеви, лозинке и сертификати морају бити правилно ускладиштени и заштићени.
- Треба имплементирати енкрипцију датотека, енкрипцију базе података и енкрипцију елемената података.
Избор језика за сигурно кодирање
Избор језика за кодирање можда неће зависити од сигурног кодирања. Не постоји ништа специфично као заштићени или несигурни језик за кодирање за изградњу безбедног софтвера.
Управо како користимо програмски језик за изградњу софтвера и колико детаљног знања програмер има о језику кодирања у примени безбедносних аспеката.
Међутим, појашњава се да је ипак Стандарди сигурног кодирања неовисни су о избору језика, најбоље праксе сигурног кода зависе од језика, зависе од платформе и примене .
Дакле, да би имао безбедни код, неопходно је да програмер има детаљно знање језика који се користи у програму, тако да се најбоље праксе безбедности могу лако применити.
Пример:
- Вероватноћа рањивости на преливање бафера разликује се од језика до језика, али се Ц, Ц ++ и Ассембли сматрају најосетљивијим због својих застарелих могућности управљања меморијом. Неколико стандардних Ц либ функција, као што су стрцпи () и мемцпи (), рањиво је на нападе преливања међуспремника. Неправилна употреба ових функција копирањем изворног међуспремника који је превелик да би се уклопио у одредишни бафер резултира преливањем међуспремника.
- Уобичајени проблем у веб апликацијама заснованим на Јави су могућа цурења ресурса која могу настати услед отворених системских ресурса, као што су датотеке, утичница и везе са базом података.
Следећи аспект безбедности односи се на алати који ће се користити у апликационом програму за оптимизацију сигурности, користећи алате као што су Интегрисана развојна окружења ће бити најкорисније јер пружају много Упозорења корисницима и скрените пажњу на та упозорења да покушају да побољшају квалитет софтвера.
- Интеграција комерцијалних или опен-соурце библиотека / додатака као што су Ецлипсе, Спринг Тоол Суите, РАД са ИДЕ помаже програмерима да напишу сигуран код откривањем и идентификовањем потенцијално рањивог кода и даје упозорења о налазима у вези са извршењем злонамерних датотека, цурењем информација и неправилно руковање грешкама.
Такође је неопходно користити Статички и динамички анализатори за побољшање безбедносних аспеката софтвера. Генерално, статички анализатори су оптимизовани за одређене врсте грешака, па на крају проналазе велики број лажно позитивних резултата док идентификују одређене грешке. Понекад постоје могућности да и они пропусте стварне грешке.
Због тога се препоручује употреба више статичких анализатора да би се постигло боље покривање различитих врста грешака и да би се избегло пуно лажних позитивних резултата. Понекад се препоручује и спровођење ручно испитивање до елиминисати лажне позитивне резултате .
Сигурна правила кодирања и препоруке
Било би добро да Програм дефинише скуп „Правила и препоруке за сигурно кодирање“ на који изворни код може да се процени усклађеност како би тестери могли да изврше „Испитивање усаглашености“ за сваки од ових безбедних стандарда кодирања.
Отуда безбедносни код може бити сертификован као усклађен или неусаглашен користећи та правила у односу на постављену меру.
Неколико правила наведена у наставку могу се користити за проверу безбедносних повреда:
- Датотеке треба затворити када више нису потребне.
- Кад год пролази структура преко границе, треба избегавати цурење информација.
- Објекте треба пријавити у одговарајућем трајању складиштења.
Дакле, тест случајеви за верификацију ових правила морају бити дизајнирани и спроведени како би се проверила усклађеност са усаглашеношћу. Такође је утврђено да су већина рањивости узроковане типичним уобичајеним програмским грешкама.
Стога програмер треба да разуме „Несигурна метода кодирања“ , док такође уче најбоље праксе сигурног кодирања. Идеално је прикупити најчешће програмске грешке које доприносе сигурносним рањивостима њихове апликације како би се могле бринути о њима током кодирања.
Оваквим типичним програмским грешкама доприносе углавном преливање међуспремника, скриптирање на више локација и недостаци убризгавања.
Неке од типичних програмских рањивости укључују,
- СКЛ убризгавање (Неправилна неутрализација посебних елемената коришћених у СКЛ наредби).
- Преливање целог броја.
- Прелив бафера (Копија бафера без провере величине улаза).
- Неконтролисани низ формата.
- Недостаје потврда идентитета и ауторизација (нетачна ауторизација).
- Изложеност осетљивим подацима.
- Неправилно руковање грешкама.
Неке од ових грешака могу довести до пада система, непредвиђеног приступа систему и хакера да изгубе контролу над софтвером.
Честе грешке у програмирању које треба избегавати
У наставку је наведено неколико уобичајених грешака у програмирању које треба избегавати:
- Неправилна неутрализација специјалних елемената који се користе у СКЛ наредби („СКЛ Ињецтион“).
- Копија бафера без провере величине улаза („Класични прелив бафера“).
- Недостаје потврда идентитета због критичне функције.
- Недостаје или је погрешно одобрење.
- Употреба тврдо кодираних акредитива.
- Недостаје шифровање осетљивих података.
- Неограничено отпремање датотека опасног типа.
- Ослањање на непоуздане улазе у одлуци о безбедности.
- Извршење са непотребним привилегијама.
- Кривотворење захтева за више локација (ЦСРФ).
- Преузимање кода без провере интегритета.
- Нетачно израчунавање величине бафера.
- Неправилно ограничење прекомерних покушаја аутентификације.
- Преусмеравање УРЛ-а на непоуздану локацију („Отворено преусмеравање“).
- Неконтролисани низ формата.
- Употреба једносмерног хеша без соли.
Контролна листа за праксе сигурних кодова
На крају, али не најмање важно, након разматрања свих горе наведених тачака аспеката сигурног развоја софтвера, програмери треба да следе Успостављена листа за проверу сигурних кодова како би се осигурало да се ствари не пропусте. У наставку је дато неколико, али не исцрпних спискова.
Провера уноса:
- Не верујте уносу, размислите о централизованој провери уноса.
- Не ослањајте се на проверу на страни клијента.
- Будите опрезни са питањима канонизације.
- Ограничите, одбаците и санирајте унос. Потврдите тип, дужину, формат и опсег.
Аутентикација:
- Место партиције по анонимном, идентификованом и овереном подручју.
- Користите јаке лозинке.
- Подржавају периоде истека лозинке и онемогућавање налога.
- Не чувајте акредитиве (користите једносмерне хешеве са сољу).
- Шифрујте комуникационе канале да бисте заштитили токене за потврду идентитета.
- Колачиће за потврду идентитета прослеђујте само преко ХТТПС веза.
Овлашћење:
- Користите најмање привилеговане налоге.
- Узмите у обзир грануларност ауторизације.
- Спровести раздвајање привилегија.
- Ограничите приступ корисника ресурсима на нивоу система.
- Користите ОАутх 2.0 протокол за аутентификацију и ауторизацију.
- Провера АПИ-ја за спровођење.
- Дозвољене методе на белој листи.
- Заштитите привилеговане акције и осетљиве колекције ресурса.
- Заштитите се од кривотворења ресурса на више локација (ЦСРФ).
Управљање сесијама:
- Направите идентификатор сесије на серверу.
- Прекините сесију одјављивањем.
- Генеришите нову сесију о поновној потврди идентитета.
- Поставите атрибут „сигурно“ за колачиће који се преносе преко ТЛС-а.
Криптографија:
- Користите криптографију док су „Подаци у пролазу, подаци у складишту, подаци у покрету, интегритет поруке“.
- Не развијајте своје. Користите проверене функције платформе.
- Нека нешифрирани подаци буду близу алгоритма.
- Користите прави алгоритам и величину кључа.
- Избегавајте управљање кључевима (користите ДПАПИ).
- Повремено крените кључевима.
- Чувајте кључеве на ограниченом месту.
Евидентирање и ревизија:
- Утврдите злонамерно понашање.
- Знајте како изгледа добар саобраћај.
- Ревизија и евидентирање активности кроз све слојеве апликација.
- Сигуран приступ датотекама евиденције.
- Правите резервне копије и редовно анализирајте датотеке дневника.
Излазно кодирање:
- Извођење „Провера ваљаности уноса (КСМЛ, ЈСОН….).
- Користите параметарски упит.
- Спроведите „Валидацију шеме“.
- Извршите кодирање (КСМЛ, ЈСОН ..).
- Пошаљите безбедносна заглавља.
Референца: ' ОВАСП листа сигурних пракси кодирања (Укратко, СЦП контролна листа) '
Табеларни сажетак листе сигурног кодирања
Доња табела резимира „Ствари које треба запамтити због сигурног кода“ апликације.
# | Шта? |
---|---|
7 | Да би се осигурало да је цео тим приморан да се придржава стандарда сигурног кодирања. |
1 | Да бисте јасно разумели „Шта је сигуран код“? |
два | Да бисте разумели уобичајене „Изворе рањивости“. |
3 | Да би се тиму одржала „Сесија свести о безбедности“. |
4 | Идентификовати и анализирати „ризике и хартије од вредности“ који су укључени у апликацију и методе за „ублажавање“. |
5 | „Обучити тим“ о стандардима сигурног кодирања, најбољим праксама и смерницама. |
6 | Да бисте дефинисали „Стандард за сигурно кодирање“ |
8 | Да бисте користили „Језик који је лак за примену“ и имали „детаљно знање“ о њему. |
9 | Да користите ИДЕ (Интегрисано развојно окружење) алате |
10 | Употреба „статичких и динамичких анализатора“ и „више статичких анализатора“ за уклањање „лажних позитивних резултата“ |
Једанаест | Да бисте извршили „ручно тестирање“ где год је потребно да бисте идентификовали грешку, пропустите. |
12 | Дефинисати скуп „Правила и препоруке за безбедно кодирање“ |
13 | Извршити „Испитивање усклађености“ за постављена правила. |
14 | Да бисте разумели „несигуран метод кодирања“ и сакупили „Уобичајене грешке у програмирању“. |
петнаест | Да се строго придржавате „СЦП контролне листе“ |
Закључак
Надамо се да ће вам овај водич бити најбољи водич за осигуравање софтверске сигурности.
Смернице за кодирање за сигуран развој софтвера овде су наведене једноставним речима са примерима за ваше лако разумевање концепта.
Срећно читање !!
Препоручено читање
- Испитивање сигурности (Комплетан водич)
- Топ 30 НАЈБОЉИХ компанија за кибернетику у 2021. години (мала и велика предузећа)
- Основи рачунарског програмирања за почетнике | Водич за кодирање
- Топ 15 најбољих бесплатних уредника кода за савршено искуство кодирања
- Водич за тестирање СКЛ убризгавања (Пример и спречавање напада СКЛ убризгавањем)
- Програмери нису добри тестери. Шта кажете?
- Формат и смернице за решавање радова ИСТКБ Фоундатион Екам
- Смернице за тестирање безбедности мобилне апликације