Pengantar
Control Flow Integrity (CFI) adalah mekanisme keamanan yang dirancang untuk menjaga agar program tetap mengikuti alur eksekusi yang valid. Teknologi ini membantu mencegah attacker mengubah jalannya program setelah berhasil mengeksploitasi kerentanan memory corruption.
CFI sangat relevan pada aplikasi yang menggunakan bahasa seperti C dan C++. Clang menyediakan beberapa mekanisme CFI untuk mendeteksi kondisi yang dapat digunakan attacker untuk memanipulasi control flow program (dikutip dari: Clang – Control Flow Integrity).
baca juga : Content Security Policy (CSP) Bypass: Memahami Celah dan Cara Memperkuat Perlindungan XSS
Apa Itu Control Flow Integrity?
Secara sederhana, CFI memastikan bahwa program hanya boleh berpindah ke target eksekusi yang valid.
Program memiliki banyak instruksi, fungsi, dan percabangan. Dalam kondisi normal, alur tersebut mengikuti aturan yang sudah ditentukan developer.
Masalah muncul ketika kerentanan seperti buffer overflow memungkinkan attacker memengaruhi alamat tujuan eksekusi. Tanpa perlindungan tambahan, kondisi tersebut dapat digunakan untuk menjalankan kode atau fungsi yang tidak seharusnya dipanggil.
CFI menambahkan pemeriksaan untuk membatasi perpindahan tersebut.
Mengapa CFI Dibutuhkan?
Memory corruption tidak selalu langsung menghasilkan eksekusi kode berbahaya. Attacker juga dapat mencoba mengubah control flow agar program menjalankan instruksi yang sudah tersedia dengan urutan yang berbeda.
Teknik seperti Return-Oriented Programming (ROP) dan berbagai bentuk control-flow hijacking memanfaatkan konsep tersebut.
CFI berusaha mempersempit pilihan target yang dapat digunakan. Dengan demikian, eksploitasi memory corruption menjadi lebih sulit dilakukan.
Bagaimana Cara Kerja CFI?
CFI membuat aturan mengenai tujuan eksekusi yang dianggap valid.
Ketika program melakukan operasi tertentu, sistem dapat memeriksa apakah tujuan tersebut sesuai dengan aturan yang telah ditentukan.
1. Program Memiliki Control Flow yang Valid
Compiler menganalisis hubungan antara fungsi dan operasi pemanggilan dalam program.
2. Pemeriksaan CFI Ditambahkan
Compiler kemudian menambahkan mekanisme pemeriksaan pada bagian tertentu.
3. Program Berjalan
Saat program melakukan indirect call, virtual call, atau operasi lain yang dilindungi, targetnya diperiksa.
4. Pelanggaran Dapat Dihentikan
Jika target tidak sesuai dengan aturan CFI, eksekusi dapat dihentikan. Pada implementasi Clang, pelanggaran CFI secara default dapat menyebabkan program melakukan abort (dikutip dari: Clang – Control Flow Integrity).
Forward-Edge dan Backward-Edge
CFI dapat digunakan untuk melindungi berbagai jenis perpindahan control flow.
Forward-Edge
Forward-edge berkaitan dengan perpindahan seperti function call atau indirect call.
Contohnya adalah ketika program menggunakan function pointer. Attacker yang berhasil memodifikasi pointer tersebut dapat mencoba mengarahkannya ke fungsi yang tidak seharusnya dipanggil.
CFI dapat memeriksa apakah target tersebut sesuai dengan tipe atau aturan yang valid.
Backward-Edge
Backward-edge berkaitan dengan return dari sebuah fungsi.
Perlindungan pada bagian ini dapat membantu mencegah attacker memanipulasi alamat return untuk mengubah alur program.
Keduanya memiliki tujuan yang sama, yaitu menjaga agar perpindahan eksekusi tetap berada dalam jalur yang diperbolehkan.
baca juga : Software-Defined Perimeter (SDP): Cara Kerja dan Perannya dalam Keamanan Zero Trust
Jenis Pemeriksaan CFI
Implementasi CFI dapat memiliki beberapa jenis pemeriksaan.
Indirect Call Checking
Pemeriksaan ini memastikan indirect function call menuju fungsi dengan tipe yang sesuai.
Virtual Call Checking
Pada C++, CFI dapat memeriksa virtual function call untuk memastikan objek memiliki tipe yang valid.

Cast Checking
CFI juga dapat memeriksa penggunaan cast yang menghasilkan tipe objek yang tidak sesuai.
Clang menyediakan beberapa skema tersebut, termasuk cfi-vcall, cfi-icall, cfi-derived-cast, dan cfi-nvcall (dikutip dari: Clang – Control Flow Integrity).
CFI dan Memory Corruption
CFI bukan mekanisme untuk memperbaiki semua jenis memory corruption.
Misalnya, sebuah aplikasi masih dapat memiliki buffer overflow. Namun, jika attacker mencoba memanfaatkan kerentanan tersebut untuk mengubah control flow, CFI dapat membatasi target yang dapat digunakan.
Karena itu, CFI sebaiknya dianggap sebagai lapisan pertahanan tambahan.
Pengembang tetap perlu menerapkan secure coding, memory safety, input validation, serta mekanisme mitigasi lainnya.
CFI pada Compiler
CFI dapat diterapkan pada tahap kompilasi.
Pada Clang, misalnya, beberapa mekanisme CFI dapat diaktifkan menggunakan opsi seperti:
-fsanitize=cfi
Implementasi tertentu membutuhkan Link-Time Optimization (LTO) agar compiler dapat melakukan analisis yang diperlukan (dikutip dari: Clang – Control Flow Integrity).
Pendekatan ini memungkinkan pemeriksaan keamanan dimasukkan langsung ke dalam program yang telah dikompilasi.
Kelebihan CFI
CFI memiliki beberapa manfaat penting.
- Membatasi target control flow.
- Mengurangi peluang control-flow hijacking.
- Membantu menghadapi eksploitasi memory corruption.
- Dapat diterapkan pada tahap kompilasi.
- Menjadi lapisan tambahan dalam application security.
Dengan perlindungan tersebut, attacker tidak bebas mengarahkan program ke sembarang fungsi atau alamat.
Keterbatasan CFI
CFI bukan solusi keamanan yang sempurna.
Implementasinya dapat memiliki batasan pada kompatibilitas, shared library, performa, dan konfigurasi compiler. Dokumentasi Clang juga menunjukkan bahwa beberapa skema CFI memiliki persyaratan tertentu terkait LTO, visibility, dan static linking (dikutip dari: Clang – Control Flow Integrity).
Selain itu, CFI tidak menggantikan praktik secure coding. Kerentanan aplikasi tetap harus diperbaiki pada sumbernya.
CFI vs DEP dan ASLR
CFI sering digunakan bersama mekanisme mitigasi eksploitasi lainnya.
DEP/NX membantu mencegah area memori tertentu dieksekusi sebagai kode. Sementara itu, ASLR mengacak lokasi berbagai bagian program di memori.
CFI memiliki fokus berbeda. Teknologi ini membatasi ke mana control flow boleh berpindah.
Ketiganya dapat menjadi bagian dari strategi defense-in-depth untuk meningkatkan kesulitan eksploitasi.
baca juga : Pass-the-Ticket (PtT) Attack: Cara Kerja dan Ancaman terhadap Keamanan Kerberos
Kesimpulan
Control Flow Integrity (CFI) merupakan mekanisme keamanan yang menjaga agar eksekusi program tetap mengikuti jalur yang valid.
Teknologi ini sangat berguna untuk menghadapi serangan yang mencoba memanfaatkan memory corruption dan mengubah control flow program. CFI dapat memeriksa indirect call, virtual call, cast, serta operasi lainnya sesuai implementasinya.
Namun, CFI bukan pengganti secure coding. Perlindungan terbaik tetap membutuhkan kombinasi memory-safe programming, validasi input, patch keamanan, ASLR, DEP/NX, dan mitigasi eksploitasi lainnya.
Dengan penerapan yang tepat, CFI dapat menjadi salah satu lapisan pertahanan penting untuk memperkuat keamanan aplikasi dan sistem modern.







