İ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!
Code Review Nedir?
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.
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
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
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.
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
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}'"
Python:
query = "SELECT * FROM users WHERE username=%s AND password=%s"
cursor.execute(query, (username, password))
Örnek 2: Command Injection (Python)
Kötü Örnek:
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:
İ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:
İ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.
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:
İ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:
İ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:
İ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:
İ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:
İ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ış
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!
İyi örnekte, dış varlık işlemelerini devre dışı bırakarak bu tür saldırıları önleriz.
Kapanış
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: