Code Review Nedir? Nasıl Yapılır? Örneklerle Anlatım!

Enistein

Kıdemli Üye
16 Eyl 2012
2,222
1,228
Amsterdam
f8l1281.png


İyi günler Türk Hack Team ailesi.

Bugün sizlerle siber güvenlik alanında mesleğini icra edenlerin çok sık karşılaştığı code review konusuna değineceğiz.
Code review, yazılım geliştirme sürecinin önemli bir parçasıdır ve hataların, güvenlik açıklarının ve diğer sorunların tespit edilmesine yardımcı olur.
Ayrıca farklı programlama dillerinde, farklı zaafiyetlere yönelik örnekler vereceğim.

Umarım faydalı bir içerik olur. Şimdiden bu alanda kariyer yapmayı planlayan herkese başarılar!

PpUz4Fr.gif

IvwCnY9.png

Code Review Nedir?
F3beZqk.png

Code review, diğer geliştiricilerin yazılım kodlarını inceleyerek hataları ve güvenlik açıklarını tespit etme sürecidir.

Bu süreç, kodun kalitesini ve güvenliğini artırmaya yardımcı olur.
Code review sürecinde, kodun okunabilirliği, performansı, güvenilirliği ve güvenliği değerlendirilir. Ayrıca, kodun işlevselliği ve uyumluluğu kontrol edilir.

tQNypkt.png


Siber Güvenlik ve Code Review İlişkisi

Siber güvenlik ve code review, yazılım geliştirme sürecinde yakından ilişkilidir.

Code review süreci, siber güvenlik açısından önemli olan güvenlik açıklarının erken tespit edilmesine ve önlenmesine yardımcı olur.
Bu, yazılımın güvenliği ve genel işlevselliği üzerinde önemli bir etkiye sahiptir.

Code Review Sürecinde İzlenecek Adımlar
F3beZqk.png


WaYaaol.png

Hazırlık Aşaması
İlk olarak, geliştiricilerin kodu incelemeye başlamadan önce proje hakkında bilgi sahibi olmaları ve projenin gereksinimlerini anlamaları gerekir.


Kodun İncelenmesi
Geliştiriciler, kodun işlevselliğini ve güvenliğini değerlendirmek için kodu dikkatlice incelemelidir. Bu süreçte, kodun yapısı, kullanılan diller ve kütüphaneler, algoritmalar ve diğer teknik detaylar incelenir.

Geri Bildirim ve İletişim İnceleme sürecinde bulunan hatalar
Güvenlik açıkları ve diğer sorunlar, kodun yazarına geri bildirim olarak iletilir. Bu geri bildirimler, yazarın kodu düzeltmesine ve geliştirmesine yardımcı olur.

Kod yazarı, alınan geri bildirimlere göre kodu düzeltir ve geliştirir.
Daha sonra, kod tekrar incelenir ve süreç, tüm hatalar ve güvenlik açıkları giderilene kadar devam eder. Bu tekrarlayan süreç, kodun kalitesini ve güvenliğini sürekli olarak artırır.


Code Review'de Dikkat Edilmesi Gereken Güvenlik İlkeleri
F3beZqk.png

GOHgexH.png

En az ayrıcalık prensibi
Kullanıcıların ve sistemlerin yalnızca gerektiği kadar yetkiye sahip olmalarını sağlamak önemlidir. Bu, kötü niyetli saldırıların etkisini sınırlamaya yardımcı olur.
En az ayrıcalık prensibi (Principle of Least Privilege), Siber Güvenlik ve Code Review süreçlerinde sıkça kullanılan bir prensiptir.
Bu prensibe göre, bir kullanıcının veya bir sürecin sadece yapması gereken işleri yapabilmesi için gereken minimum ayrıcalık seviyesi verilmelidir.


Giriş doğrulama ve sanitizasyonu
Kötü amaçlı kullanıcıların enjeksiyon saldırıları gerçekleştirmesini önlemek için, tüm kullanıcı girişlerinin doğrulanması ve temizlenmesi önemlidir.

Giriş doğrulama, bir kullanıcının kimliğini ve yetkilerini doğrulamak için kullanılan bir yöntemdir.
Kullanıcının sisteme erişim sağlamadan önce doğrulama kimlik bilgilerini (kullanıcı adı, şifre vb.) sağlaması gerektiği anlamına gelir.


Sanitizasyon ise, girdilerin güvenli bir şekilde işlenmesini sağlamak için kullanılan bir yöntemdir.
Girdiler, kullanıcılar tarafından sağlanan veriler olabilir ve bu verilerin güvenliği sağlanmalıdır.
Sanitizasyon, girdilerdeki potansiyel güvenlik tehditlerini ortadan kaldırmayı ve sistem açıklarını engellemeyi amaçlar.
Örneğin, bir web formundaki girdilerde, kötü niyetli bir kullanıcının kod enjekte etmesini önlemek için girdiler sanitize edilir.


dCIvbRz.png


Güvenli şifreleme ve depolama
Hassas verilerin güvende tutulması için, güçlü şifreleme algoritmalarının kullanılması ve verilerin güvenli bir şekilde depolanması önemlidir.

Hata ve olağanüstü durum yönetimi
Yazılımın güvenliğini artırmak için, hata ve olağanüstü durumların doğru bir şekilde yönetilmesi ve kaydedilmesi önemlidir.

Code Review Örnekleri
F3beZqk.png

Bu aşamada sizlere farklı programlama dillerinde, farklı yaklaşımlar göstereceğim.
Tabii bunlar benim örneklerimdir. Farklı yaklaşımlar mevcuttur.


Örnek 1: SQL Enjeksiyonu Senaryosu (Python)
Kötü Örnek:
Python:
query = f"SELECT * FROM users WHERE username='{username}' AND password='{password}'"
İyi Örnek:
Python:
query = "SELECT * FROM users WHERE username=%s AND password=%s"
cursor.execute(query, (username, password))
Örnek 2: Command Injection (Python)
Kötü Örnek:
Python:
import os
user_input = input("Enter a file name: ")
os.system(f"cat {user_input}")
İyi Örnek:
Python:
import os
import shlex
user_input = input("Enter a file name: ")
os.system(f"cat {shlex.quote(user_input)}")
Bu örnekte, kötü amaçlı bir kullanıcı, user_input değişkenine zararlı komutlar ekleyerek command injection gerçekleştirebilir.
İyi örnekte, shlex.quote işlevi kullanılarak kullanıcı girişi doğru bir şekilde temizlenir ve zaafiyet önlenir.


Örnek 3: Path Traversal (Java)
Kötü Örnek:
Java:
String fileName = request.getParameter("file");
File file = new File("static/" + fileName);
FileInputStream fis = new FileInputStream(file);
İyi Örnek:
Java:
String fileName = request.getParameter("file");
File file = new File("static/" + fileName).getCanonicalFile();
if (!file.getPath().startsWith("static/")) {
    throw new SecurityException("Invalid file path");
}
FileInputStream fis = new FileInputStream(file);
Bu örnekte, kötü niyetli bir kullanıcı, fileName değişkenine "../" gibi zararlı dizin göstergeleri ekleyerek path traversal saldırısı gerçekleştirebilir.
İyi örnekte, getCanonicalFile ve startsWith metotları kullanılarak kullanıcı girişi doğru bir şekilde temizlenir ve zaafiyet önlenir.


Örnek 4: Insecure Deserialization (C#)
Kötü Örnek:
C#:
using System.Runtime.Serialization.Formatters.Binary;
// ...
BinaryFormatter formatter = new BinaryFormatter();
object deserializedObject = formatter.Deserialize(stream);
İyi Örnek:
Bu durumda, güvenli alternatifler kullanarak deserialization işlemi gerçekleştirilmelidir. Örneğin, JSON.NET kütüphanesi ile güvenli bir şekilde deserialize edebilirsiniz.
C#:
using Newtonsoft.Json;
// ...
object deserializedObject = JsonConvert.DeserializeObject<ObjectType>(json);
Insecure deserialization, kötü amaçlı kullanıcıların sisteme zarar verici nesneler enjekte etmesine izin verir.
İyi örnekte, güvenli bir deserialization kütüphanesi kullanarak bu tür saldırıları önlemeye yardımcı olur.


Örnek 5: CSRF (Cross-Site Request Forgery) Zaafiyetleri (Ruby on Rails)
Kötü örnek:
Ruby:
class ApplicationController < ActionController::Base
  skip_before_action :verify_authenticity_token
end
İyi örnek:
Ruby:
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
end

CSRF saldırıları, kötü niyetli kullanıcıların başka kullanıcılar adına istenmeyen istekler göndermelerine neden olabilir.
İyi örnekte, Rails uygulaması protect_from_forgery ile CSRF korumasını etkinleştirerek bu tür saldırıları önler.


Örnek 6: Hatalı İzin Kontrolleri (Node.js)
Kötü Örnek:
JavaScript:
app.get('/admin', (req, res) => {
  res.sendFile(path.join(__dirname, 'admin.html'));
});
İyi Örnek:
JavaScript:
app.get('/admin', (req, res) => {
  if (!req.isAuthenticated() || !req.user.isAdmin) {
    return res.sendStatus(403);
  }
  res.sendFile(path.join(__dirname, 'admin.html'));
});
Bu örnekte, kötü niyetli kullanıcılar hatalı izin kontrolleri nedeniyle hassas sayfalara erişebilir.
İyi örnekte, kullanıcının kimliğini doğrulayan ve yönetici olduğunu kontrol eden bir middleware eklenerek bu tür saldırıları önler.


Örnek 7: Hatalı Try Catch Yönetimi (PHP)
Kötü Örnek:
PHP:
try {
    // ...
} catch (Exception $e) {
    echo "Error: " . $e->getMessage();
}
İyi Örnek:
PHP:
try {
    // ...
} catch (Exception $e) {
    error_log("Error: " . $e->getMessage());
    header('HTTP/1.1 500 Internal Server Error');
    exit();
}
Bu örnekte, hatalı hata yönetimi nedeniyle, hassas hata bilgileri kullanıcılara gösterilebilir.
İyi örnekte, hata bilgileri sunucu günlüğüne yazılır ve kullanıcılara sadece genel bir hata mesajı gösterilir.


Örnek 8: Zaafiyetli Yönlendirme (Golang)
Kötü Örnek:
Kod:
http.HandleFunc("/redirect", func(w http.ResponseWriter, r *http.Request) {
    target := r.URL.Query().Get("target")
    http.Redirect(w, r, target, http.StatusFound)
})
İyi Örnek:
Kod:
http.HandleFunc("/redirect", func(w http.ResponseWriter, r *http.Request) {
    target := r.URL.Query().Get("target")
    if strings.HasPrefix(target, "https://turkhackteam.com") {
        http.Redirect(w, r, target, http.StatusFound)
    } else {
        http.Error(w, "Unauthorized redirect target", http.StatusUnauthorized)
    }
})
Zaafiyetli yönlendirme, kötü niyetli kullanıcıların diğer kullanıcıları zararlı web sitelerine yönlendirmesine izin verir.
İyi örnekte, sadece güvendiğimiz alanlara yapılan yönlendirmelere izin vererek bu tür saldırıları önleriz.


Örnek 9: XML External Entity (XXE) Açıkları (Java)
Kötü Örnek:
Java:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new InputSource(new StringReader(xmlString)));
İyi Örnek:
Java:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new InputSource(new StringReader(xmlString)));
XXE açıkları, kötü niyetli kullanıcıların harici sistemlere erişmesine ve hassas verileri çalmasına izin verir.
İyi örnekte, dış varlık işlemelerini devre dışı bırakarak bu tür saldırıları önleriz.


Kapanış
F3beZqk.png

Umarım faydalı bir içerik olmuştur.
Eğer bu tarz konular ilginizi çekiyorsa, önceden paylaşmış olduğum içeriklere göz atabilirsiniz!

SCADA & ICS Zaafiyetleri ve Bash Örnekleri!
Meltdown ve Spectre: Modern İşlemcilerdeki Güvenlik Zaafiyetleri
Python ile Zararlı Yazılım Analizi!
HackRF ile Bluetooth Low Energy Sniffing #3
HackRF ile Replay Attack #2
HackRF Nedir? | HackRF ile GPS Spoofing #1
Phishing URL Kısaltma Uygulaması Yazalım! | Phishing için URL Tekniği
QRLJacking Nedir? | Whatsapp Saldırı Vektörü Oluşturalım!
 
Son düzenleme:

Enistein

Kıdemli Üye
16 Eyl 2012
2,222
1,228
Amsterdam
Elinize emeğinize sağlık, forumda konulara en özen gösteren kişi sizsiniz :)
Elinize sağlık hocam, gerçekten harikka olmuş
Her zamanki gibi süper 🔥
Elinize sağlık, çok iyi anlatım
Mükemmel bu forumda ilk defa gördüğüm en iyi hocasınız ve konu harika elinize sağlık.

Güzel yorumlarınız için teşekkür ederim 💙
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.