====== 11. Programare sigură ======
Atunci când scriem programe, ținând cont de problemele care pot să apară, folosim tehnici de programare sigură (//secure programming//) sau programare defensivă (//defensive programming//). Aceasta înseamnă să evităm apariția de bug-uri și vulnerabilități prin folosirea corespunzătoare a tipurilor de date, a apelurilor de funcții și prin verificarea atentă a intrării într-un program. Dezvoltatorul va trata intrarea, codul refolosit, bibliotecile ca fiind nesigure și surse de bug-uri și atacuri și va scrie cod în mod corespunzător.
===== Subiecte abordate =====
* programare sigură
* programare defensivă
* CWE (//Common Weakness Enumeration//)
* SSDL (//Secure Software Development Lifecycle//)
===== Resurse =====
* [[http://koala.cs.pub.ro/training/res/secure-low-level-programming/slides/11-programare-sigura.pdf|Slide-uri]]
* [[http://koala.cs.pub.ro/training/res/secure-low-level-programming/arc/11-programare-sigura-skel.zip|Arhiva de suport]]
===== Alte resurse =====
* [[https://www.amazon.com/Secure-Coding-2nd-Software-Engineering/dp/0321822137|Robert Seacord: Secure Coding in C/C++, 2nd Edition]] ([[http://index-of.es/Miscellanous/LIVRES/Pearson.Secure.2nd.Edition.Oct.2013.ISBN.0321822137.pdf|PDF]])
* https://wiki.sei.cmu.edu/confluence/display/c/SEI+CERT+C+Coding+Standard
* https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId=88046682
* https://dwheeler.com/secure-programs/
* https://en.opensuse.org/SDB:Secure_coding_checklist:_C_and_C%2B%2B
* https://www.owasp.org/index.php/How_to_write_insecure_code
* https://github.com/patricia-gallardo/insecure-coding-examples
* https://github.com/deadbits/InsecureProgramming
* https://cwe.mitre.org
===== Exerciții =====
/*
Arhiva de suport pentru exerciții se găsește [[http://koala.cs.pub.ro/training/res/secure-low-level-programming/arc/11-programare-sigura-skel.zip|aici]]. Descărcați arhiva și apoi decomprimați-o folosind comenzile:
wget http://koala.cs.pub.ro/training/res/secure-low-level-programming/arc/11-programare-sigura-skel.zip
unzip 11-programare-sigura-skel.zip
cd 11-programare-sigura-skel/
*/
==== Reguli Secure Coding ====
Parcurgem două reguli din [[https://wiki.sei.cmu.edu/confluence/display/c/SEI+CERT+C+Coding+Standard|SEI CERT C Coding Standard]] și două reguli din [[https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId=88046682|SEI CERT C++ Coding Standard]]. Identificați problemele pe care le rezolvă și indicațiile de rezolvare a acestora.
==== Exemple nesigure ====
Parcurgeți exemplele de cod nesigure din subdirectorul ''vulnerable/'' din [[https://github.com/patricia-gallardo/insecure-coding-examples|acest repository]]. Pentru a clona repository-ul folosiți comanda
git clone https://github.com/patricia-gallardo/insecure-coding-examples
Apoi accesați subdirectorul ''vulnerable/'' din repository și parcurgeți fișierele cod sursă C sau C++ de acolo.
==== Alte exemple nesigure ====
Parcurgeți exemplele de cod nesigure din [[https://github.com/deadbits/InsecureProgramming|acest repository]]. Pentru a clona repository-ul folosiți comanda
git clone https://github.com/deadbits/InsecureProgramming
Parcurgeți **toate** fișierele cod sursă C din rădăcina repository-ului și identificați, rapid, bug-ul/vulnerabilitatea și ce problemă cauzează (și, dacă e cazul, cum poate fi exploatată).
==== Bad vs. Good ====
Accesați [[https://samate.nist.gov/SRD/testsuite.php|NIST Software Assurance Reference Dataset Project]].
Descărcați:
* suita //C Test Suite for Source Code Analyzer v2 - Vulnerable// (Test Suite ID 100)
* suita //C Test Suite for Source Code Analyzer v2 - Secure// (Test Suite ID 101)
Alegeți cel puțin 5 exemple din suita vulnerabilă și identificați vulnerabilitatea. Gândiți soluția pentru acea vulnerabilitate și vedeți dacă este similară celei din suita sigură. În suita sigură identificatorul exemplului este mai mare cu 1 față de cel din suita vulnerabilă. De exemplu pentru exemplul ''043'' din suita vulnerabilă, identificatorul este ''044'' ca mai jos:
cat 100/000/149/043/Format_string_problem-bad.c
cat 101/000/149/044/Format_string_problem-good.c