Memory'de Açık Olarak Görünen Kritik Bilgiler ve SAST Araçlarıyla Tespiti

Bu yazıda, bir uygulamanın çalışması sırasında memory’ye yazdığı kritik bilgilerin nasıl dump edilebileceğini ve bu tür zafiyetlerin bir SAST (Static Application Security Testing) aracı olan Fortify ile nasıl önceden yakalanabileceğini inceleceğiz. Bunun için aşağıdaki basit java koduna bakalım.

//getsecretstring.java

import java.io.Console;

public class getsecretstring {
    public static void main(String[] args) {
        Console console = System.console();
        if (console == null) {
            System.out.println("Couldn't get Console instance");
            System.exit(0);
        }

        String password = new String(console.readPassword("Enter your secret password: "));
        System.out.println("Press any key to exit...");
        console.readLine();
    }
}

Kod komut satırından parolayı alıp, biz bir tuşa basana kadar bekliyor. Bu koddaki ana problem parolanın string olarak kaydedilmesi. Stringler değişmezdirler (immutable) ve sadece JVM garbage collector’ı string değerini memory’den temizleyebilir. Şimdi kodu çalıştırıp, verdiğimiz parolayı memory’den okuyabilecek miyiz görelim.

Kodu derledik, çalıştırdık ve parolayı girdik. Şimdi memory’yi inceleyelim.

jps komutuyla, çalışan java proseslerinin id’lerini aldık. jmap komutuyla bu prosesin memory’sini diskte bir dosyaya kopyalayabiliriz. Girdiğimiz parolayı, bu dosyanın içindeki stringlerin içinde aradığımızda, PSWD0!! stringini görebiliyoruz ki bu koda verdiğimiz parola.

Girdiğimiz parolayı, açık olarak memory’de görmüş olduk. Şimdi bu tür zafiyetleri Fortify ile nasıl keşfedebiliriz ona bakalım.

Taramayı gerçekleştirdik, sonuçlarını arayüzde detaylı inceleyelim.

Fortify, bu durumu Privacy Violation zafiyeti olarak tespit etti. String gibi değişmez bir obje kullanmak yerine, değişken(mutable) bir obje olan array kullanıp, veriyle işimiz bittikten sonra bu objeyi sıfırlamamız(nullify) gerektiği önerisini verdi.

Bu şekilde bir kod yazalım.

//getsecretarray.java

import java.util.Arrays;
import java.io.Console;

public class getsecretarray {
    public static void main(String[] args) {
        Console console = System.console();
        if (console == null) {
            System.out.println("Couldn't get Console instance");
            System.exit(0);
        }

        char[] passwordChars = console.readPassword("Enter your secret password: ");
        Arrays.fill(passwordChars, ' ');

        System.out.println("Press any key to exit...");
        console.readLine();
    }
}

Aynı testleri yeni kod üzerinde gerçekleştirelim.

Bu sefer parolayı yakalayamadık. Ama unutmayalım, array kullanmak güvenli bir yöntem olsa da, tamamen aşılamaz değil. O yüzden, ortamda hangi kullanıcıların memory dump yetkisine sahip olduğu her zaman gözden geçirilmeli. □

Written by

Furkan Turan