Pengantar
Format String Attack adalah serangan yang memanfaatkan penggunaan format string secara tidak aman. Kerentanan ini sering ditemukan pada aplikasi yang menggunakan fungsi seperti printf(), fprintf(), sprintf(), atau snprintf().
Masalah muncul ketika input dari pengguna langsung digunakan sebagai format string. Akibatnya, karakter khusus seperti %x, %s, atau %n dapat diproses sebagai instruksi oleh fungsi tersebut. MITRE mengklasifikasikan kelemahan ini sebagai CWE-134: Use of Externally-Controlled Format String (dikutip dari: MITRE CWE-134).
Apa Itu Format String Attack?
Format string digunakan untuk menentukan bagaimana sebuah data ditampilkan.
Contohnya:
printf("Nama: %s", username);
Pada kode tersebut, %s adalah format specifier, sedangkan username merupakan data yang akan ditampilkan.
Masalah terjadi jika input pengguna langsung menjadi format string:
printf(uername);
Dalam kondisi tersebut, aplikasi tidak lagi memperlakukan username hanya sebagai teks. Karakter format di dalam input dapat ikut diproses oleh printf().
OWASP menjelaskan bahwa kondisi ini dapat menyebabkan information disclosure, error, buffer overflow, hingga code execution, tergantung pada lingkungan dan fungsi yang digunakan (dikutip dari: OWASP – Format String Attack).
baca juga : DNS-over-QUIC (DoQ): Teknologi DNS Encrypted yang Lebih Cepat dan Privat
Bagaimana Format String Attack Terjadi?
Serangan biasanya berawal dari input eksternal yang masuk ke fungsi format tanpa pembatasan yang tepat.
1. Input Pengguna Diterima
Aplikasi menerima data dari pengguna, misalnya melalui form, parameter, atau command-line argument.
2. Input Digunakan sebagai Format String
Developer kemudian meneruskan input tersebut langsung ke fungsi seperti printf().
3. Format Specifier Diproses
Jika input mengandung format specifier, fungsi dapat mencoba memprosesnya sebagai instruksi format.
4. Dampak Terjadi
Program dapat mengalami error, membocorkan data dari memori, atau dalam kondisi tertentu memungkinkan manipulasi memori.
Karena itu, masalah utama bukan sekadar adanya karakter %, tetapi input yang tidak dipercaya digunakan sebagai format string.
Mengapa Format String Bisa Berbahaya?
Fungsi printf() dan keluarga fungsinya dapat menerima jumlah argumen yang bervariasi. Jika format string berasal dari pengguna, program dapat diarahkan untuk memproses argumen yang tidak dimaksudkan developer.
Beberapa format specifier juga memiliki dampak keamanan tertentu.
| Specifier | Fungsi Umum |
|---|---|
%d |
Menampilkan bilangan desimal |
%x |
Menampilkan bilangan dalam format hexadecimal |
%s |
Menampilkan string |
%p |
Menampilkan alamat pointer |
%n |
Menulis jumlah karakter ke alamat tertentu |
Penggunaan format string yang dikendalikan attacker dapat menyebabkan memory disclosure atau memory modification, terutama pada aplikasi C/C++. MITRE mencatat bahwa %n dapat digunakan untuk menulis nilai ke lokasi memori tertentu ketika kondisi yang diperlukan terpenuhi (dikutip dari: MITRE CWE-134). 
Dampak Format String Attack
Information Disclosure
Attacker dapat memanfaatkan format string untuk memperoleh informasi yang seharusnya tidak ditampilkan aplikasi.
Data tersebut dapat membantu attacker memahami kondisi memori atau struktur internal program.
Denial of Service
Input tertentu dapat menyebabkan program mengalami error atau crash.
Dampaknya bisa mengganggu ketersediaan aplikasi.
Memory Corruption
Dalam kondisi tertentu, format string dapat digunakan untuk memengaruhi isi memori.
Risikonya menjadi lebih serius jika aplikasi memiliki kerentanan lain yang dapat dikombinasikan.
Code Execution
Pada skenario tertentu, manipulasi memori dapat berkembang menjadi eksekusi kode. Namun, keberhasilannya bergantung pada arsitektur, compiler, mitigasi keamanan, dan kondisi aplikasi.
Contoh Kode yang Rentan
Berikut contoh sederhana:

#include <stdio.h>
int main(int argc, char *argv[]) {
printf(argv[1]);
return 0;
}
Masalahnya terletak pada argv[1] yang langsung digunakan sebagai format string.
Jika input mengandung format specifier, printf() dapat memprosesnya.
OWASP memberikan contoh serupa dan membandingkannya dengan penggunaan format string yang aman (dikutip dari: OWASP – Format String Attack).
baca juga : MQTT Protocol Security: Cara Mengamankan Komunikasi IoT dari Ancaman Siber
Cara Mencegah Format String Attack
Pencegahannya sebenarnya cukup sederhana: jangan jadikan input pengguna sebagai format string.
Gunakan Format String yang Tetap
Kode yang lebih aman:
printf("%s", username);
Dengan cara ini, username hanya diperlakukan sebagai data.
Berbeda dengan:
printf(username);
Pada kode kedua, pengguna memiliki kendali terhadap format string.
Gunakan Compiler Warning
Compiler dapat membantu menemukan penggunaan fungsi format yang berpotensi tidak aman.
Gunakan tingkat peringatan compiler yang tinggi selama proses development.
Lakukan Code Review
Periksa penggunaan fungsi seperti:
printf()fprintf()sprintf()snprintf()vprintf()vsprintf()vsnprintf()
Format String Attack vs Buffer Overflow
Keduanya sering dikaitkan karena sama-sama dapat memengaruhi keamanan memori. Namun, konsepnya berbeda.
Buffer overflow terjadi ketika data melebihi kapasitas buffer yang tersedia.
Sementara itu, format string vulnerability terjadi ketika attacker dapat mengontrol format string yang digunakan oleh fungsi pemformatan.
Format string bahkan dapat menyebabkan memory corruption tanpa mekanisme buffer overflow secara langsung. MITRE juga menegaskan bahwa format string vulnerability secara teknis bukan sekadar buffer overflow, meskipun keduanya dapat memiliki konsekuensi yang berkaitan.
Mengapa Kerentanan Ini Masih Penting?
Format String Attack memang lebih umum ditemukan pada aplikasi lama, terutama yang menggunakan C atau C++. Namun, konsepnya tetap penting dipahami.
Kesalahan sederhana dalam penggunaan fungsi logging atau output dapat membuka celah keamanan. Karena itu, developer perlu memastikan bahwa format string berasal dari sumber yang terpercaya.
Selain itu, penggunaan compiler modern dan static analysis dapat membantu menemukan pola kode yang berisiko sebelum aplikasi dirilis.
baca juga : DMARC, DKIM, dan SPF: Tiga Lapisan Penting untuk Melindungi Email dari Spoofing
Kesimpulan
Format String Attack terjadi ketika input yang dikendalikan pengguna digunakan sebagai format string pada fungsi seperti printf().
Kerentanan ini dapat menyebabkan information disclosure, crash, memory corruption, dan dalam kondisi tertentu bahkan code execution.
Pencegahan utamanya sederhana. Gunakan format string yang ditentukan oleh developer dan perlakukan seluruh input pengguna sebagai data.
Dengan menerapkan secure coding, compiler warning, static analysis, dan code review, risiko Format String Attack dapat dikurangi secara signifikan.









