Dokumen PDF sangatlah kuat, namun kekuatan tersebut membawa risiko keamanan yang melekat. Karena PDF mendukung file tertanam, JavaScript interaktif, dan aliran biner yang kompleks, PDF sering digunakan sebagai vektor untuk pengiriman malware. Buffer overflow, pembacaan di luar batas, dan integer overflow di parser PDF yang ditulis dengan buruk dapat mengarah pada eksekusi kode jarak jauh (RCE).
Jika Anda membangun aplikasi di Delphi yang menerima PDF unggahan pengguna (misalnya, portal penyerapan dokumen), memastikan pem-parsing-an PDF yang aman memori merupakan persyaratan keamanan yang sangat penting.
Vektor Serangan PDF Umum
PDF berbahaya biasanya menargetkan kerentanan dalam parser itu sendiri dan bukan pada sistem operasi. Teknik-teknik umum meliputi:
- Tabel Referensi Silang (XRef) Cacat: Membuat offset pointer yang mengarah ke luar batas, membuat parser crash atau memungkinkan pengungkapan memori.
- Putaran Tak Terbatas: Membuat referensi sirkular antara objek-objek PDF (misalnya, Objek A mereferensikan Objek B, yang mereferensikan Objek A) yang mengarah pada kelelahan tumpukan (stack exhaustion).
- Dekompresi Meledak (Zip Bombs): Aliran
FlateDecodeyang mendekompresi dari beberapa kilobyte menjadi gigabyte, menguras memori sistem.
Strategi Pem-parsing-an Defensif di Delphi
Saat mem-parsing PDF secara native di Delphi, Anda harus memprogram secara defensif. Anda tidak dapat mempercayai metadata yang disediakan dalam kamus PDF.
1. Memutuskan Referensi Sirkular
Saat menelusuri pohon objek PDF secara rekursif, Anda harus memelihara riwayat objek yang dikunjungi untuk mencegah putaran tak terbatas.
uses
System.Generics.Collections, System.SysUtils;
// A safe recursive function to walk the PDF tree
procedure ParsePDFDictionary(DictObj: TPDFDictionary; Visited: TList<Integer>);
var
ObjID: Integer;
begin
ObjID := DictObj.ObjectID;
if Visited.Contains(ObjID) then
begin
Writeln('Warning: Circular reference detected. Aborting branch.');
Exit;
end;
Visited.Add(ObjID);
try
// Process child objects safely...
finally
// Allow siblings to traverse, but prevent vertical recursion loops
Visited.Remove(ObjID);
end;
end;
2. Melindungi Terhadap Zip Bombs
Saat menerapkan filter FlateDecode untuk mendekompresi aliran, Anda harus membatasi ukuran ekspansi maksimum secara ketat. Jangan pernah mengalokasikan memori secara membabi buta berdasarkan kunci kamus /Length.
const
MAX_DECOMPRESSED_SIZE = 1024 * 1024 * 50; // 50 MB safety limit
procedure DecompressPDFStream(CompressedStream, OutputTarget: TStream);
var
ZLibStream: TZDecompressionStream;
Buffer: array[0..8191] of Byte;
BytesRead, TotalRead: Integer;
begin
ZLibStream := TZDecompressionStream.Create(CompressedStream);
try
TotalRead := 0;
repeat
BytesRead := ZLibStream.Read(Buffer[0], SizeOf(Buffer));
if BytesRead > 0 then
begin
TotalRead := TotalRead + BytesRead;
if TotalRead > MAX_DECOMPRESSED_SIZE then
raise Exception.Create('Security Exception: Decompression bomb detected!');
OutputTarget.WriteBuffer(Buffer[0], BytesRead);
end;
until BytesRead = 0;
finally
ZLibStream.Free;
end;
end;
Memanfaatkan Mesin yang Diperkuat dan Komponen yang Aman
Menulis pengurai PDF yang sepenuhnya aman dari awal adalah tugas yang sangat besar. Pendekatan standar industri adalah menggunakan mesin yang diperkuat dan diuji fuzz secara intensif seperti PDFium, atau mengandalkan pustaka native yang diuji secara ketat.
PDFium adalah mesin rendering inti yang digunakan oleh Google Chrome. Karena Chrome memproses jutaan PDF yang tidak tepercaya setiap hari, PDFium mengalami pengujian fuzz yang agresif dan berkelanjutan oleh Project Zero dari Google. Mesin ini menangani XRef yang cacat, aliran yang rusak, dan referensi siklik dengan baik.
Demikian pula, komponen native seperti HotPDF Component dan Delphi PDF Library menggabungkan strategi penguraian defensif yang kuat secara langsung. Mereka menerapkan pemeriksaan batas yang ketat, pembatas kedalaman rekursif, dan mekanisme pencegahan kebocoran memori yang dirancang khusus untuk lingkungan Delphi dan C++Builder.
Baik Anda memilih untuk menggunakan PDFium melalui pembungkus Delphi untuk rendering, atau memanfaatkan komponen native seperti HotPDF untuk pembuatan dan pemrosesan dokumen, Anda mewarisi perimeter keamanan tingkat perusahaan, melindungi pengguna dan server Anda dari muatan berbahaya tanpa harus menulis sendiri pengurai defensif.
Catatan: Kemampuan penguraian yang aman dan teruji fuzz tersedia di seluruh rangkaian produk kami, termasuk HotPDF Component, Delphi PDF Library, dan PDFium Component.