Qorǵanıw programmalastırıw

**Qorǵanıw programmalastırıw** — bul potencial qáwipsizlik anomaliyaların anıqlawǵa hám aldınnan belgilengen juwaplardı beriwge uqıplı programmalar islep shıǵıwǵa arnalǵan qorǵanıw dizaynınıń bir túri. Ol kútilmegen jaǵdaylarda programmalıq támiynat bóliminiń úziliksiz islew qábiletin támiyinleydi. Qorǵanıw programmalastırıw ámeliyatları kóbinese joqarı dárejede qoljetimlilik, qáwipsizlik yamasa qorǵanıw kerek bolǵan jerlerde qollanıladı.

Qorǵanıw programmalastırıwı programmalıq támiynattı hám derek kodın tómendegi jaqtan jaqsılawǵa qaratılǵan usıl:

* Ulıwma sapası – programmalıq támiynat qáteleriniń hám máseleleriniń sanın azaytıw.
* Derek kodın túsinikli etiw – derek kodı kod auditinde maqullanıwı ushın oqılatuǵın hám túsinikli bolıwı kerek.
* Programmalıq támiynattıń kútilmegen kirgiziwlerge yamasa paydalanıwshı háreketlerine qaramastan aldınnan boljanatuǵın usılda islewi.

Degen menen, júdá qorǵanıw programmalastırıwı hesh qashan ushıraspaytuǵın qátelerden qorǵanıwı múmkin, bul orınlanıw waqtındaǵı hám qollap-quwatlawǵa baylanıslı shıǵınlarǵa alıp keledi.

## Qáwipsiz programmalastırıw
Qáwipsiz programmalastırıw — bul kompyuter qáwipsizligine baylanıslı qorǵanıw programmalastırıwınıń bir bólimi. Másele qáwipsizlik bolıp tabıladı, minnetli túrde qorǵanıw yamasa qoljetimlilik emes (programmalıq támiynat belgili bir usıllar menen islemey qalıwına ruqsat etiliwi múmkin). Barlıq qorǵanıw programmalastırıw túrlerinde bolǵanı sıyaqlı, qátelerden qashıw tiykarǵı maqset bolıp tabıladı; degen menen, motivaciya ádettegi jumıs waqtında sátsizlik itimallıǵın azaytıw emes (eger másele qáwipsizlik bolsa), al hújim maydanın azaytıw — baǵdarlamashı programmalıq támiynattıń qátelerdi ashıw ushın belsendi túrde nadurıs paydalanılıwı múmkin ekenin hám qátelerdiń jaman niyet penen paydalanılıwı múmkin ekenin boljawı kerek.
```c
int risky_programming(char *input) {
  char str[1000]; 
  
  // ...
  
  strcpy(str, input);  // Kirgizilgen maǵlıwmattı kóshiriw.
  
  // ...
}
```
Funkciya kirgiziw 1000 belgiden artıq bolǵanda anıqlanbaǵan háreketke alıp keledi. Geypara baǵdarlamashılar bunı másele dep esaplamawı múmkin, hesh qanday paydalanıwshı sonshelli uzın kirgiziw engizbeydi dep oylap. Usı belgili bir qáte buferdiń tolıp ketiwi hújimlerin múmkin etetuǵın hálsizlikti kórsetedi. Mine, usı mısalǵa sheshim:
```c
int secure_programming(char *input) {
char str[1000+1]; // Nul simvolı ushın jáne bir orın.

// ...

// Maqset uzınlıǵınan aspastan kirgiziwdi kóshiriw.
strncpy(str, input, sizeof(str));

// Eger strlen(input) >= sizeof(str) bolsa, strncpy nul menen tamamlamaydı.
// Biz oǵan buferdegi sońǵı simvoldı bárqulla NUL-ge ornatıw arqalı qarsı turamız,
// bul qatardı biz qayta isley alatuǵın maksimal uzınlıqqa nátiyjeli túrde qısqartıp.
// Eger strlen(input) júdá uzın bolsa, programmanı anıq toqtatıwǵa da boladı.
str[sizeof(str) - 1] = '\0';

// ...
}
```


## Hújimlik programmalastırıw
Hújimlik programmalastırıw — bul qorǵanıw programmalastırıwınıń bir kategoriyası bolıp, onda belgili bir qátelerdiń qorǵanıw usılında qayta islenbewi kerekligine ayrıqsha itibar beriledi. Bul ámeliyatta, tek programmanıń basqarıwınan tıs qáteler ǵana qayta islenedi (mısalı, paydalanıwshı kirgiziwi); programmalıq támiynattıń ózi, sonday-aq programmanıń qorǵanıw sızıǵı ishindegi maǵlıwmatlarǵa usı metodologiyada iseniw kerek.

### Ishki maǵlıwmatlardıń durıslıǵına iseniw

; Artıqmash qorǵanıw programmalastırıw

```c
const char* trafficlight_colorname(enum traffic_light_color c) {
switch (c) {
case TRAFFICLIGHT_RED: return "qızıl";
case TRAFFICLIGHT_YELLOW: return "sarı";
case TRAFFICLIGHT_GREEN: return "jasıl";
}
return "qara"; // Óshken svetofor retinde qayta islenedi.
}
```


; Hújimlik programmalastırıw

```c
const char* trafficlight_colorname(enum traffic_light_color c) {
switch (c) {
case TRAFFICLIGHT_RED: return "qızıl";
case TRAFFICLIGHT_YELLOW: return "sarı";
case TRAFFICLIGHT_GREEN: return "jasıl";
}
assert(0); // Bul bólimniń jetip bolmaytuǵının tastıyıqlaw.
}
```


### Programmalıq támiynat komponentlerine iseniw

; Artıqmash qorǵanıw programmalastırıw

```c
if (is_legacy_compatible(user_config)) {
// Strategiya: Jańa kodtıń birdey isleytuǵınına isenbew
old_code(user_config);
} else {
// Keri qaytıw: Jańa kodtıń birdey jaǵdaylardı qayta isleytuǵınına isenbew
if (new_code(user_config) != OK) {
old_code(user_config);
}
}
```


; Hújimlik programmalastırıw

```c
// Jańa kodta jańa qáteler joq dep kútiledi
if (new_code(user_config) != OK) {
// Durıs itibar alıw ushın dawıslı túrde xabar beriw hám programmanı birden toqtatıw
report_error("Júdá jaman bir nárse boldı");
exit(-1);
}
```


## Texnikalar
Mine, geypara qorǵanıw programmalastırıw usılları:

### Aqıllı derek kodın qayta paydalanıw
Eger bar kod testlengen hám isleytuǵını belgili bolsa, onı qayta paydalanıw qátelerdiń kirgiziliw itimallıǵın azaytıwı múmkin.

Degen menen, kodtı qayta paydalanıw bárqulla jaqsı ámeliyat emes. Bar kodtı qayta paydalanıw, ásirese keń tarqalǵanda, basqa jaǵdayda múmkin bolǵannan keńirek auditoriyaǵa baǵdarlanǵan hújimlerdi jaratıwǵa imkaniyat beriwi múmkin hám ózi menen birge qayta paydalanılǵan kodtıń barlıq qáwipsizlik hám hálsizliklerin alıp keledi.

Bar bolǵan derek kodın paydalanıwdı qarastırǵanda, modullerdi (klasslar yamasa funkciyalar sıyaqlı kishi bólimler) tez kórip shıǵıw hár qanday potencial hálsizliklerdi joq etiwge yamasa baǵdarlamashını olardan xabardar etiwge járdem beredi hám onıń proektte paydalanıwǵa sáykes keletuǵının támiyinleydi. 

#### Eskirgen máseleler
Eski derek kodın, kitapxanalardı, API-lerdi, konfiguraciyalardı hám t.b. qayta paydalanıwdan aldın, eski jumıstıń qayta paydalanıw ushın jaramlı ekenin yamasa onıń eskirgen máselelerge beyim ekenin qarastırıw kerek.

Eskirgen máseleler — bul eski dizaynlar búgingi talaplar menen islesiwi kútilgende payda bolatuǵın máseleler, ásirese eski dizaynlar sol talaplardı esapqa alıp islep shıǵarılmaǵan yamasa testlenbegen bolsa.

Kóplegen programmalıq támiynat ónimleri eski eskirgen derek kodı menen máselelerge ushırasqan; mısalı:

* Eskirgen kod qorǵanıw programmalastırıw baslaması astında proektlestirilmegen bolıwı múmkin hám sonlıqtan jańa proektlestirilgen derek kodınan ádewir tómen sapaǵa iye bolıwı múmkin.
* Eskirgen kod endi qollanılmaytuǵın shártlerde jazılǵan hám testlengen bolıwı múmkin. Eski sapa kepilligi testleri endi jaramlı bolmawı múmkin.
** **1-mısal**: eskirgen kod ASCII kirgiziwi ushın proektlestirilgen bolıwı múmkin, biraq házir kirgiziw UTF-8.
** **2-mısal**: eskirgen kod 32-bitlik arxitekturalarda kompilyaciyalanǵan hám testlengen bolıwı múmkin, biraq 64-bitlik arxitekturalarda kompilyaciyalanǵanda, jańa arifmetikalıq máseleler payda bolıwı múmkin (mısalı, nadurıs belgi testleri, nadurıs tip túrlendiriwleri hám t.b.).
** **3-mısal**: eskirgen kod oflayn mashinalar ushın jobalastırılǵan bolıwı múmkin, biraq tarmaq baylanısı qosılǵannan keyin hálsiz bolıp qaladı.
* Eskirgen kod (miyras kod) jańa máselelerdi esapqa alıp jazılmaǵan. Mısalı, 1990-jılı jazılǵan derek kodı kóp kod inyekciyası hálsizliklerine beyim bolıwı itimal, sebebi bunday máselelerdiń kópshiligi sol waqıtta keńnen túsinilmegen edi.

Eskirgen (miyras) máseleniń belgili mısalları:

* BIND 9, Pol Viksi hám Devid Konrad tárepinen «BINDv9 — bul tolıq qayta jazıw», «Qáwipsizlik dizaynda tiykarǵı itibarǵa alınǵan» dep usınılǵan, eski eskirgen kodtı qayta jazıw ushın tiykarǵı máseleler retinde qáwipsizlik, bekkemlik, keńeytiw imkaniyatı hám jańa protokollardı atap ótti.
* Microsoft Windows «sol» Windows Metafile hálsizliginen hám WMF formatına baylanıslı basqa hújimlerden zıyan kórdi. Microsoft Qáwipsizlik Juwap Orayı WMF ózgesheliklerin bılay táriyipleydi: «Shama menen 1990-jılı WMF qollap-quwatlawı qosıldı... Bul qáwipsizlik landshaftında basqa bir dáwir edi... hámmesi tolıq isenimli edi», Microsofttaǵı qáwipsizlik baslamaları astında islep shıǵarılmaǵan.
* Oracle eski derek kodı sıyaqlı SQL inyekciyası hám artıqmashılıqlardı arttırıw máselelerin esapqa almay jazılǵan eskirgen (miyras) máseleler menen gúrespekte, bul dúzetiw ushın waqıt talap etken hám de tolıq emes dúzetiwler payda etken kóp qáwipsizlik hálsizliklerine alıp keldi. Bul Devid Litchfild, Aleksandr Kornbrust, Sezar Serrudo sıyaqlı qáwipsizlik ekspertleriniń qattı sın pikirine sebep boldı. Qosımsha sın — standart ornatıwlar (tiykarınan eski versiyalardan miyras) ózleriniń Oracle Maǵlıwmatlar Bazası Qáwipsizlik Tekseriw Dizimi sıyaqlı qáwipsizlik usınıslarına sáykes kelmeydi, bunı dúzetiw qıyın, sebebi kóp qosımshalar durıs islew ushın qáwipsiz emes eskirgen sazlawlardı talap etedi.

### Kanonikalıq kóriniske keltiriw
Jaman niyetli paydalanıwshılar nadurıs maǵlıwmatlardıń jańa kórinislerin oylap tabıwı itimal. Mısalı, eger programma «/etc/passwd» faylına kiriwdi biykar etiwge urınsa, xaker bul fayl atınıń «/etc/./passwd» sıyaqlı basqa bir variantın beriw múmkin. Kanonikalıq kóriniske keltiriw kitapxanaları kanonikalıq emes kirgiziw sebepli payda bolatuǵın qátelerden qashıw ushın qollanılıwı múmkin.

### «Potencial» qátelerge tómen shıdamlılıq
Máselege beyim bolıp kórinetuǵın kod konstrukciyaların (belgili hálsizliklerge uqsas hám t.b.) qáteler hám potencial qáwipsizlik kemshilikleri dep esaplań. Tiykarǵı qaǵıyda: «Men barlıq qáwipsizlik hújimleri túrlerin bilmeymen. Men ózim biletuǵınlarınan qorǵanıwım kerek, sońınan men proaktiv bolıwım kerek!».

### Kodtı qorǵawdıń basqa usılları

* Eń keń tarqalǵan máselelerdiń biri — programmaǵa kirgiziwler sıyaqlı dinamikalıq ólshemli maǵlıwmatlar ushın turaqlı ólshemli yamasa aldınnan ajıratılǵan strukturalardı tekserilmegen paydalanıw (buferdiń tolıp ketiwi máselesi). Bul ásirese C-degi qatar maǵlıwmatları ushın keń tarqalǵan. gets sıyaqlı C kitapxanası funkciyaları hesh qashan paydalanılmawı kerek, sebebi kirgiziw buferiniń maksimal ólshemi argument retinde berilmeydi. scanf sıyaqlı C kitapxanası funkciyaların qáwipsiz paydalanıwǵa boladı, biraq baǵdarlamashıdan onı paydalanıwdan aldın tazalap, qáwipsiz format qatarların tańlawda abaylı bolıwdı talap etedi.
* Tarmaqlar arqalı jiberiletuǵın barlıq áhmiyetli maǵlıwmatlardı shifrlań/autentifikaciyalań. Óz shifrlaw sxemańızdı ámelge asırıwǵa urınbań, onıń ornına sınap kórilgenin paydalanıń. Xesh yamasa uqsas texnologiya menen xabardı tekseriw de tarmaq arqalı jiberilgen maǵlıwmatlardı qorǵawǵa járdem beredi.

#### Maǵlıwmatlar qáwipsizliginiń úsh qaǵıydası

* Barlıq maǵlıwmatlar basqasha dálillengenshe áhmiyetli.
* Barlıq maǵlıwmatlar basqasha dálillengenshe pataslanǵan.
* Barlıq kod basqasha dálillengenshe qáwipsiz emes.
** Siz paydalanıwshı keńisligindegi hár qanday kodtıń qáwipsizligin dálilley almaysız, yamasa, kóbirek belgili bolǵanı: «klientke hesh qashan isenbeń».

Maǵlıwmatlar qáwipsizligi haqqındaǵı bul úsh qaǵıyda hár qanday maǵlıwmattı, ishki yamasa sırtqı derekten alınǵanın qalay qayta islew kerekligin táriyipleydi:

Barlıq maǵlıwmatlar basqasha dálillengenge shekem áhmiyetli — bul barlıq maǵlıwmatlardıń joq etilmesten aldın shıǵındı ekenligi tekseriliwi kerekligin bildiredi.

Barlıq maǵlıwmatlar basqasha dálillengenge shekem pataslanǵan — bul barlıq maǵlıwmatlardıń pútinligin tekserilmegenshe, qalǵan orınlanıw ortalıǵına zıyan keltirmeytuǵın usılda qayta isleniw kerekligin bildiredi.

Barlıq kod basqasha dálillengenge shekem qáwipsiz emes — azǵana nadurıs atama bolsa da, kodımızdıń qáwipsiz ekenine hesh qashan isenbewimiz kerekligin esletip turadı, sebebi qáteler yamasa anıqlanbaǵan háreketler proektti yamasa sistemanı keń tarqalǵan SQL inyekciyası hújimleri sıyaqlı hújimlerge ushıratıwı múmkin.

#### Qosımsha informaciya

* Eger maǵlıwmatlardıń durıslıǵın tekseriw kerek bolsa, onıń nadurıs ekenin emes, al durıs ekenin tekseriń.
* Shártnama boyınsha dizayn
* Tastıyıqlawlar (sonday-aq tastıyıqlawshı programmalastırıw dep te ataladı)
* Qaytarılatuǵın kodlarǵa qaraǵanda ayrıqsha jaǵdaylardı qollanıń
** Ulıwma alǵanda, API shártnamańızdıń bir bólimin májbúrleytuǵın hám baǵdarlamashını baǵdarlaytuǵın ayrıqsha jaǵday xabarların taslaw, ayrıqsha jaǵday qayerde júz bergenin yamasa programma stegi qanday kórinetuǵının kórsetpeytuǵın qáte kodı mánislerin qaytarıwdan jaqsıraq. Jaqsıraq jurnalǵa jazıw hám ayrıqsha jaǵdaylardı qayta islew baǵdarlamashı stresin[derek kerek] minimallastırıp, programmalıq támiynatıńızdıń bekkemligin hám qáwipsizligin arttıradı.

## Derekler

__BÖLİDİMÖNDEMEW__