<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[ITSEC Asia Research-Based Growth and Learning Hub]]></title><description><![CDATA[Empowering Minds with Cutting-Edge Research and Learning Excellence]]></description><link>https://learning.intellibron.io/</link><image><url>https://learning.intellibron.io/favicon.png</url><title>ITSEC Asia Research-Based Growth and Learning Hub</title><link>https://learning.intellibron.io/</link></image><generator>Ghost 5.64</generator><lastBuildDate>Mon, 20 Apr 2026 02:07:29 GMT</lastBuildDate><atom:link href="https://learning.intellibron.io/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Penutup]]></title><description><![CDATA[Tulisan ini bertujuan untuk memperkenalkan bug NULL Pointer Dereference dan juga metodologi bagaimana sebuah bug dapat di eksploitasi sehingga dapat menguasai sistem operasi target. ]]></description><link>https://learning.intellibron.io/lesson/penutup-course-id-11/</link><guid isPermaLink="false">68f731f3a8c70f0001058ef0</guid><dc:creator><![CDATA[Muhammad Rasyid Sahputra]]></dc:creator><pubDate>Thu, 26 Oct 2023 06:53:33 GMT</pubDate><media:content url="https://learning.intellibron.io/content/images/2024/07/_1979c99c-18c5-4c23-8486-b9cd45bfd80c.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://learning.intellibron.io/content/images/2024/07/_1979c99c-18c5-4c23-8486-b9cd45bfd80c.jpeg" alt="Penutup"><p>Seiring dengan perkembangan jaman terutama di era industri 4.0 saat ini semakin banyak aplikasi dan sistem dibangun untuk membantu kehidupan manusia. Ada banyak sekali kelas <em>security bug,</em> dan setiap aplikasi ataupun sistem tidak akan lepas dari yang namanya <em>security bug</em>.</p>
<p>Mudah-mudahan dengan memahami bug <em>NULL Pointer Dereference</em> akan lebih banyak lagi pihak terutama para <em>software developer</em> yang <em>aware</em> terkait masalah security sehingga dapat mengembangkan aplikasi atau sistem yang jauh lebih <em>secure</em> dari sebelumnya.</p>]]></content:encoded></item><item><title><![CDATA[Wunderbar Emporium]]></title><description><![CDATA[Wunderbar_emporium dirilis oleh Brad Spander sekitar tanggal 14 Agustus 2009, eksploit tersebut sebagai respon dari advisories yang dirilis oleh Tavis Ormandy dan Julien Tinnes (Google Security Team) kepada public.]]></description><link>https://learning.intellibron.io/lesson/wunderbar-emporium-course-id-11/</link><guid isPermaLink="false">68f731f3a8c70f0001058eef</guid><dc:creator><![CDATA[Muhammad Rasyid Sahputra]]></dc:creator><pubDate>Thu, 26 Oct 2023 06:51:20 GMT</pubDate><media:content url="https://learning.intellibron.io/content/images/2024/07/_db629d7e-1c43-4f8e-a777-950415734ff4.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://learning.intellibron.io/content/images/2024/07/_db629d7e-1c43-4f8e-a777-950415734ff4.jpeg" alt="Wunderbar Emporium"><p>Bug tersebut merupakan <em>NULL Pointer Dereference</em> yang disebabkan oleh &#x201C;<strong>incorrect proto_ops initializations</strong>&#x201D; pada kernel linux (CVE-2009&#x2013;2692).</p>
<div class="kg-card kg-toggle-card" data-kg-toggle-state="close">
            <div class="kg-toggle-heading">
                <h4 class="kg-toggle-heading-text"><span style="white-space: pre-wrap;">Ringkasan CVE-2009-2692:</span></h4>
                <button class="kg-toggle-card-icon">
                    <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                        <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"/>
                    </svg>
                </button>
            </div>
            <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">The Linux kernel 2.6.0 through 2.6.30.4, and 2.4.4 through 2.4.37.4, does not initialize all function pointers for socket operations in proto_ops structures, which allows local users to trigger a NULL pointer dereference and gain privileges by using mmap to map page zero, placing arbitrary kode on this page, and then invoking an unavailable operation, as demonstrated by the sendpage operation (sock_sendpage function) on a PF_PPPOX socket.&#xA0;</span></p></div>
        </div>
<p>Pada advisories mereka yang dipublish oleh beberapa mailing-list security[<a href="http://archives.neohapsis.com/archives/fulldisclosure/2009-08/0174.html?ref=learning.intellibron.io" rel="noopener">12</a>], diberikan juga bagaimana metode untuk men-<em>trigger</em> bug tersebut.</p>
<p>Pembahasan lengkap mengenai bug serta eksploit ini telah dilakukan oleh<br>xorl[<a href="http://xorl.wordpress.com/2009/08/18/cve-2009-2692-linux-kernel-proto_ops-null-pointer-dereference/?ref=learning.intellibron.io" rel="noopener">13</a>], sehingga pembahasan yang saya berikan pada artikel ini sifatnya hanya summary, dan yang pasti dalam bahasa Indonesia ;)</p>
<h3 id="memicu-bug-pada-kernel">Memicu Bug Pada Kernel</h3>
<p>Pertama-tama, kita akan melihat bug kernel linux yang dapat mentrigger <em>Null Pointer Dereference</em> tersebut.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1--xsujl5anxdpoewkay3owq.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="1256" height="772" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1--xsujl5anxdpoewkay3owq.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1--xsujl5anxdpoewkay3owq.png 1000w, https://learning.intellibron.io/content/images/max/800/1--xsujl5anxdpoewkay3owq.png 1256w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">struktur proto_ops pada linux kernel&#xA0;2.6.30</span></figcaption></figure>
<p>Pada Linux setiap <em>socket</em> memiliki asosiasi dengan suatu struktur yang disebut <strong>proto_ops</strong>. Struktur tersebut memiliki <em>variable pointer</em> yang menunjuk suatu fungsi operasi tertentu. Misalnya kita membuka koneksi <em>socket</em> internet, maka telah tersedia beberapa fungsi untuk operasi pada <em>socket</em> internet (seperti <strong><code>connect()</code></strong>, <strong><code>accept()</code></strong>, <strong><code>bind()</code></strong>, dll) tersebut. Nah fungsi-fungsi inilah yang ditunjuk oleh <em>variable pointer</em> struktur <em>sock_ops</em> diatas.</p>
<p>Seluruh <em>socket</em> akan diberikan struktur diatas, sehingga muncul pertanyaan bagaimana seandainya ada <em>socket</em> yang tidak mengimplementasikan satu atau beberapa operasi dari struktur<em> proto_ops</em>?! Misalnya, saya men-<em>design</em> <strong><code>cyberheb_socket()</code></strong> untuk diintegrasikan dalam Linux namun tidak ingin mengimplementasikan fungsi <strong><code>accept()</code></strong>. Jika hal tersebut terjadi maka <strong><code>cyberheb_socket()</code></strong> diharapkan untuk melakukan inisialisasi terhadap <em>variable</em> <em>pointer</em> <strong>*accept</strong> ke suatu fungsi, misalnya <strong><code>sock_no_accept()</code></strong>.</p>
<p>Sebetulnya hal ini tidak akan menjadi masalah karena biasanya implementasi suatu <em>socket</em> telah melakukan pengecekan tersendiri. Taviso dan Julien mengambil contoh<strong> <code>sock_splice_read()</code></strong>,</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-che2xhccd79yh9fatin8wq.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="1242" height="514" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-che2xhccd79yh9fatin8wq.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-che2xhccd79yh9fatin8wq.png 1000w, https://learning.intellibron.io/content/images/max/800/1-che2xhccd79yh9fatin8wq.png 1242w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">pengecekan NULL pointer derefence pada fungsi sock_splice_read()</span></figcaption></figure>
<p>Kita bisa lihat bahwa sesaat setelah <em>socket</em> di-inisialisasikan (baris 746),<br>maka pada baris berikut nya (baris 748) dilakukan pengecekan terhadap <em>NULL Pointer Dereference</em>. Jika <em>sock</em> adalah NULL maka fungsi <strong><code>sock_splice_read()</code></strong> diatas akan langsung mengembalikan nilai error. Ini adalah salah satu contoh implementasi yang baik dan sesuai aturan.</p>
<p>Namun ternyata Taviso dan Jullien menemukan fakta bahwa ada implementasi <em>socket</em> yang tidak melakukan pengecekan terhadap <em>NULL Pointer Dereference</em> sebelum melakukan <em>dereference</em>, yaitu pada implementasi <strong><code>sock_sendpage()</code></strong>.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-r7fhbfpxsqgorv3xdnt3pw.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="1186" height="640" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-r7fhbfpxsqgorv3xdnt3pw.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-r7fhbfpxsqgorv3xdnt3pw.png 1000w, https://learning.intellibron.io/content/images/max/800/1-r7fhbfpxsqgorv3xdnt3pw.png 1186w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">pengecekan NULL pointer derefence tidak dilakukan pada fungsi sock_sendpage()</span></figcaption></figure>
<p>Bisa kita lihat dengan jelas bahwa <em>sock</em> di-inisialisasikan dengan nilai dari<br><em>private_data</em> (baris 733), dan kemudian tanpa proses pengecekan apakah <em>sock</em> bernilai NULL fungsi tersebut langsung melakukan <em>dereference</em> di bagian akhir (baris 739).</p>
<p>Berdasarkan advisories tersebut beberapa contoh implementasi lain juga memiliki masalah yang sama diantaranya pada protocol <strong>PF_BLUETOOTH</strong>, <strong>PF_IUCV</strong>, <strong>PF_PPPOX</strong>, dll. Advisories mereka juga dilengkapi dengan metode untuk men-trigger bug tersebut:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-gcxse5xrf29wqp_zgvbfdg.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="950" height="376" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-gcxse5xrf29wqp_zgvbfdg.png 600w, https://learning.intellibron.io/content/images/max/800/1-gcxse5xrf29wqp_zgvbfdg.png 950w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">metode untuk men-trigger bug NULL pointer dereference pada fungsi sock_sendpage()</span></figcaption></figure>
<p><em>Advisories</em> yang lengkap walaupun tidak menyertakan eksploit. Namun bagi para <em>exploit writer</em> hal tersebut sudah cukup. Dan hal yang mungkin paling menyenangkan adalah statement berikut ini:</p>
<blockquote>&#x201C;This issue is easily exploitable for local privilege escalation. In order to exploit this, an attacker would create a mapping at address zero containing code to be executed with privileges of the kernel, and then trigger a vulnerable operation&#x201D;</blockquote>
<p>Bug tersebut terjadi pada <em>process</em> kernel, sehingga <em>privilege</em> nya merupakan <strong>ring 0</strong>. Jika kita bisa mengarahkan eksekusi <em>processor</em> dengan privilege <strong>ring 0</strong> dan mengontrolnya maka tidak ada yang tidak bisa kita lakukan.</p>
<p>Berikut ini step-by-step gambaran umum eksploit <strong>wunderbar_emporium</strong>:</p>
<ol><li>Melakukan pengecakan apakah sistem target merupakan 32-bit ataupun 64-bit. Eksploit ini <em>portable</em> sehingga bisa dilakukan pada target 32-bit ataupun 64-bit (intel).</li><li>Melakukan pengecekan terhadap <strong><code>mmap_min_addr()</code></strong> <em>restriction</em>. Cara paling mudah yang bisa dilakukan oleh user process biasa adalah melihat isi file <strong><code>/proc/sys/vm/mmap_min_addr</code></strong>. Jika <strong><code>mmap_min_addr()</code> </strong>bernilai lebih besar dari nol, maka proses eksploitasi akan dilanjutkan dengan trik bypass <strong><code>mmap_min_addr()</code></strong>, namun jika bernilai nol atau file tersebut tidak ada (versi kernel 2.6 yang lama) maka akan dilakukan proses eksploitasi. Pada <em>wunderbar_emporium2</em> juga ditambahkan pengecekan apakah terdapat SELinux (<code>/selinux/enforce</code>), jika terdapat SELinux maka akan dimanfaatkan untuk bypass <strong><code>mmap_min_addr()</code></strong> karena ternyata secara <em>default</em> <em>policy</em> SELinux malah justru dapat mem-bypass <strong><code>mmap_min_addr()</code></strong> melalui trik <em>unconfined_t</em> seperti yang digambarkan oleh Dan Walsh.</li><li>Proses bypass <strong><code>mmap_min_addr()</code></strong> (tanpa SELinux) menggunakan trik <em>pulseaudio</em>. File <em>exploit.c</em> akan di-<em>compile</em> sebagai <em>shared-object</em> (.so) yang dapat di-load sebagai library oleh <em>pulseaudio</em> (dengan options &#x201C;-L&#x201D;). Proses ini terlebih dahulu melakukan <em>set</em> <em>personality</em> menjadi <em>SVr4</em>, sehingga ketika dijalankan maka <em>pulseaudio</em> akan secara otomatis melakukan <em>mapping page 0</em>.</li><li>Proses eksploitasi akan dilakukan oleh <em>exploit.c</em>, <em>page 0</em> akan di-<em>set</em> dengan suatu fungsi yang menjalankan beberapa <em>procedure</em>. Diantara <em>procedure-procedure</em> tersebut adalah men-<em>disable</em> fitur-fitur LSM (<strong>AppArmor, Audit, SELinux</strong>). Proses ini menggunakan trik <em>patching</em> dari simbol kernel yang telah didapatkan sebelumnya. Kenapa bisa di-<em>disable</em>?! tentu saja karena pada tahap ini kita telah mendapatkan <strong>ring 0</strong> sehingga seakan-akan <em>procedure</em> ini dilakukan dengan <em>privilege kernel</em>.</li><li><em>Trigger NULL Pointer Dereference</em> pada kernel sehingga eksekusi akan dibawa ke <em>zero page</em>.</li><li>Ubah status <em>uid</em> menjadi <em>root</em>.</li><li>Bangkitkan <em>shell</em> dengan <em>uid</em> <em>root</em>.</li><li>r00tshell</li></ol>
<h3 id="eksploit-wunderbar-emporium">Eksploit Wunderbar Emporium</h3>
<p><em>Wunder emporium</em> terdiri dari 3 files: <code>wunder_emporium.sh</code>, <code>pwnkernel.c</code>,<br><code>exploit.c</code>, kita cukup menjalankan <strong>wunder_emporium.sh</strong> dan sisanya akan dijalankan oleh script tersebut. Berikut ini isi shell script tersebut:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-usy3gowwc9lvmivfcn889w.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="1364" height="1290" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-usy3gowwc9lvmivfcn889w.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-usy3gowwc9lvmivfcn889w.png 1000w, https://learning.intellibron.io/content/images/max/800/1-usy3gowwc9lvmivfcn889w.png 1364w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">wunderbar_emporium.sh</span></figcaption></figure>
<p>Script ini melakukan otomasi proses eksploitasi, dan tidak ada yang istimewa karena sudah jelas dari script<em>-</em>nya. Jika tidak ada perlindungan <strong><code>mmap_min_addr()</code></strong> maka akan segera dilakukan eksploitasi menggunakan hasil compile file <code>exploit.c</code>, namun jika terdapat <em>restriction </em><strong><code>mmap_min_addr()</code></strong> akan dilihat kembali apakah SELinux diaktifkan dan <em>Enforcing</em>, jika tidak maka dijalankan <code>pwnkernel.c</code> (trik <em>personality</em> + <em>pulseaudio</em>), namun jika terdapat SELinux dan <em>Enforcing</em> maka sesuai blog Dan Walsh akan digunakan trik <strong>unconfined_t</strong> user yang memanfaatkan <em>runcon</em> untuk mengubah <em>context process</em> (<em>bruteforce</em>) ke <strong>initrc_t, wine_t, vbetool_t, unconfined_mono_t atau samba_unconfined_net_t</strong>. Trik ini bisa dilihat mulai dari baris 26 sampai baris 44.</p>
<p>Berikutnya kita akan melihat isi file <code>kernel.c</code> yang mengimplementasikan trik <em>personality+pulseaudio</em>.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-lslud12vrdpzjkbomemu6a.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="1342" height="1380" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-lslud12vrdpzjkbomemu6a.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-lslud12vrdpzjkbomemu6a.png 1000w, https://learning.intellibron.io/content/images/max/800/1-lslud12vrdpzjkbomemu6a.png 1342w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">pwnkernel.c</span></figcaption></figure>
<p>Cukup simple dan tidak perlu panjang lebar, pwnkernel akan melakukan <em>setting</em> <em>personality</em> menjadi SVr4 (PER_SVR4) dan kemudian menjalankan pulseaudio dengan terlebih dahulu melakukan pemeriksaan apakah <em>pulseaudio</em> merupakan <em>binary</em> dengan <em>suid root</em>. Sisanya tinggal mengeksekusi <em>pulseaudio</em> dengan mendefinisikan <em>exploit.so</em> sebagai <em>library</em> untuk di-<em>load</em>. Pada tahap ini <em>page 0</em> akan di <em>map</em> <em>read-only</em> secara otomatis dan eksekusi selanjutnya akan ditangani oleh kode didalam <em>eksploit.so</em>.</p>
<p>Tentu saja bagian yang paling menarik adalah <em>exploit.c</em>, disinilah terdapat<br>kode-kode untuk melakukan <em>patching</em> LSM, mendapatkan akses root, dsb. Seperti yang telah disampaikan sebelumnya, saya akan membuang bagian video untuk keren-kerenan nya. Dan berhubung <code>exploit.c</code> adalah inti eksploitnya maka akan dibahas per fungsi.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-yon2ry0yh4v9edfoktkulw.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="748" height="422" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-yon2ry0yh4v9edfoktkulw.png 600w, https://learning.intellibron.io/content/images/max/800/1-yon2ry0yh4v9edfoktkulw.png 748w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">fungsi main()</span></figcaption></figure>
<p>Sebagaimana biasanya, eksploit akan mulai dari fungsi <strong><code>main()</code></strong>. Fungsi <strong><code>main()</code></strong> hanya terdapat 2 baris, yang pertama adalah melakukan <em>set variable</em> <em>called_from_main</em>, jika bernilai 1 maka video <em>tzameti.avi</em> akan dimainkan sesaat sebelum mendapatkan shell root, jika bernilai 0 maka video tidak akan dimainkan.</p>
<p>Selanjutnya akan dijalankan fungsi <strong><code>pa__init(NULL)</code></strong>. Mungkin ada yang bertanya mengapa memilih nama <strong><code>pa__init()</code></strong> ataupun terdapat fungsi <strong><code>pa__done()</code></strong> pada <code>exploit.c</code>?! jangan lupa, pada salah satu trik <em>bypass</em> <strong><code>mmap_min_addr()</code></strong>, <code>exploit.c</code> akan di-<em>compile</em> sebagai <em>shared object</em> dan diload sebagai <em>library</em> oleh <em>pulseaudio</em>. Dalam hal ini program utama <em>pulseaudio</em> akan mencari fungsi <strong><code>pa__init()</code></strong> dan <strong><code>pa__end()</code></strong> saat menjalankan <em>library</em> tersebut. Itu sebabnya fungsi utama dalam <em>exploit.c</em> akan dimasukan kedalam <strong><code>pa__init()</code></strong>.</p>
<p>Sekarang mari kita lihat apa isi dari fungsi <strong><code>pa_init()</code></strong>.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-yshuq6f8jsdhvas2oycaha.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="1118" height="1112" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-yshuq6f8jsdhvas2oycaha.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-yshuq6f8jsdhvas2oycaha.png 1000w, https://learning.intellibron.io/content/images/max/800/1-yshuq6f8jsdhvas2oycaha.png 1118w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">fungsi pa_init()</span></figcaption></figure>
<p>Tampak tidak asing?</p>
<p><strong>uid</strong> proses saat ini akan dimasukan kedalam <em>variable our_uid</em>, dan selanjutnya dilakukan pengecekan terhadap <em>personality</em>. Jika <em>personality process</em> saat ini bukan SVr4 (<em>zero page </em>belum di-<em>mapped</em>), maka akan dilakukan <em>mapping</em> secara manual. Kita bisa sampai pada bagian ini biasanya karena <em>kernel user</em> tidak ada <em>restriction</em> <strong><code>mmap_min_addr()</code></strong>, <strong><code>mmap_min_addr()</code></strong> di-set<br>bernilai <strong>0</strong>, atau <em>restriction </em>pada<em> </em><strong><code>mmap_min_addr()</code></strong> telah berhasil di-<em>bypass</em>.</p>
<p>Kernel lama yang menggunakan SELinux menggunakan pembatasan terhadap <em>page 0</em> dengan tidak mengijinkan mapping RWX (Read+Write+Execute), dalam hal ini <em>bypass</em>-nya cukup dengan mengganti protocol untuk mapping di <em>page 0</em> menjadi (Read+Write).</p>
<p>Jika <em>personality</em> sudah di-set SVr4 yang berarti <em>page 0</em> telah di-<em>mapped</em> (<em>Read</em>), maka tinggal mengganti hak aksesnya menggunakan <em>syscall</em> <strong><code>mprotect()</code></strong> agar menjadi (<strong>Read+Write+Execute</strong>).</p>
<p>Proses selanjutnya adalah mendapatkan lokasi modul-modul LSM yang telah diaktifkan didalam sistem target,</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-nwchigpgo4z9gbxh8vbx1g.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="1124" height="530" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-nwchigpgo4z9gbxh8vbx1g.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-nwchigpgo4z9gbxh8vbx1g.png 1000w, https://learning.intellibron.io/content/images/max/800/1-nwchigpgo4z9gbxh8vbx1g.png 1124w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">mencari lokasi modul-modul LSM dalam sistem&#xA0;target</span></figcaption></figure>
<p>Ketika kernel mengaktifkan suatu modul <em>security</em> (LSM), maka modul tersebut akan di-<em>load</em> ke suatu lokasi memory dan lokasi tersebut akan disimpan pada suatu file (<strong><code>/proc/kallsyms</code> </strong>atau<strong> <code>/proc/ksyms</code></strong>). Proses berikutnya dari <em>exploit.c</em> adalah mendapatkan lokasi LSM tersebut pada memory, hal ini dilakukan oleh fungsi <strong><code>get_kernel_sym()</code></strong> yang isinya sebagai berikut:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-72b_pqqrkybj2sngqqcv6g.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="1188" height="1186" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-72b_pqqrkybj2sngqqcv6g.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-72b_pqqrkybj2sngqqcv6g.png 1000w, https://learning.intellibron.io/content/images/max/800/1-72b_pqqrkybj2sngqqcv6g.png 1188w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">fungsi get_kernel_sym()</span></figcaption></figure>
<p>Fungsi ini akan membaca isi dari file <em><code>/proc/kallsyms</code></em> atau <em><code>/proc/ksyms</code></em> dan<br>mencari lokasinya berdasarkan input nama modul LSM yang diinginkan. Saya rasa sudah sangat jelas inti dari kode diatas.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-7kuvstzdevyjn6bvssagaa.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="1072" height="270" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-7kuvstzdevyjn6bvssagaa.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-7kuvstzdevyjn6bvssagaa.png 1000w, https://learning.intellibron.io/content/images/max/800/1-7kuvstzdevyjn6bvssagaa.png 1072w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">fungsi untuk menulis data pada lokasi </span><b><strong style="white-space: pre-wrap;">page&#xA0;0</strong></b></figcaption></figure>
<p>Bagian selanjutnya adalah menulis <em>page 0</em> yang telah di-<em>mapped</em> sebelumnya agar berisi kode-kode yang kita inginkan. Pada lokasi <strong>NULL</strong> (<em>Zero Page</em>) dimasukan <strong>0xff</strong>, pada lokasi <strong>NULL+1</strong> dimasukan <strong>0x25</strong>, dan kemudian jika mesin terget adalah 32-bit maka <strong>NULL+2</strong> akan dimasukan <strong>0</strong> namun jika target adalah komputer 64-bit maka <strong>NULL+2</strong> akan dimasukan <strong>6</strong>. Sisanya <strong>NULL+6</strong> akan dimasukan lokasi / alamat dari fungsi <strong><code>own_the_kernel()</code></strong>.</p>
<p>Untuk yang penasaran dengan proses pengecekan diatas (antara 32-bit dan 64-bit), trik ini sangat sederhana. Trik ini membandingkan size tipe data &#x201C;<strong>unsigned long</strong>&#x201D; dengan tipe data &#x201C;<strong>unsigned int</strong>&#x201D;, pada komputer 32-bit kedua tipe data ini tidak memiliki <em>size</em> yang sama namun pada komputer 64 bit kedua tipe data ini memiliki <em>size</em> yang sama.</p>
<p>Selanjutnya kita akan melihat bagaimana isi dari fungsi <strong><code>own_the_kernel()</code></strong>, karena pada saat <em>NULL Pointer Dereference</em> terjadi maka eksekusi akan dibawa pada lokasi fungsi ini berada.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-hqhgtk4talr6ayy8t5yzeg.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="1374" height="1170" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-hqhgtk4talr6ayy8t5yzeg.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-hqhgtk4talr6ayy8t5yzeg.png 1000w, https://learning.intellibron.io/content/images/max/800/1-hqhgtk4talr6ayy8t5yzeg.png 1374w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">fungsi own_the_kernel()</span></figcaption></figure>
<p>Pada saat <em>NULL pointer dereference</em> terjadi pada kernel, maka eksekusi akan<br>dibawa menuju fungsi ini dan tentu saja level <em>privilege</em>-nya adalah kernel. Jika eksekusi berhasil mencapai tahap ini maka kita sudah bisa menyatakan bahwa &#x201C;ring 0&#x201D; telah berhasil didapatkan. Bagian awal dari <strong><code>own_the_kernel()</code></strong> segera melakukan hal ini dengan men-set variable <em>got_ring0</em> dengan angka <strong>1</strong>.</p>
<p>Proses selanjutnya adalah men-<em>disable</em> LSM. Dengan <em>privilege</em> kernel maka kita dapat melakukan hal ini dengan mudah. Seperti yang telah dibahas sebelumnya bahwa <strong><code>get_kernel_sysm()</code></strong> akan memberikan lokasi modul-modul <em>security</em> yang diaktifkan, sehingga dengan operasi <em>pointer</em> kita dapat segera melakukan &#x2018;<em>patching</em>&#x2019; lokasi tersebut agar bernilai &#x2018;<strong>nol</strong>&#x2019;. </p>
<p>Ini salah satunya:</p>
<pre><code class="language-c">...
if (audit_enabled) 
  *audit_enabled = 0;
...</code></pre>
<p>Pada bagian selanjutnya yang cukup menarik adalah proses <em>patching</em> SELinux:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-wazr7mzeustbihfhjok28a.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="1022" height="1406" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-wazr7mzeustbihfhjok28a.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-wazr7mzeustbihfhjok28a.png 1000w, https://learning.intellibron.io/content/images/max/800/1-wazr7mzeustbihfhjok28a.png 1022w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">fungsi untuk disable fitur&#xA0;SELinux</span></figcaption></figure>
<p>kode diatas digunakan untuk melakukan <em>patching</em> pada<strong> <code>sel_read_enforce()</code></strong>. <em>Patching</em> ini seperti layaknya proses <em>patching</em> sebelumnya ataupun proses <em>patching</em> ketika kita hendak meng-<em>crack</em> suatu program dimana <em>patch</em> dilakukan secara langsung pada lokasi memory.</p>
<p>Pada komputer 32-bit akan dicari posisi kode &#x201C;<strong>push [selinux_enforcing]</strong>&#x201D;<br>dan menggantinya dengan &#x201C;<strong>push 1</strong>&#x201D;. Posisi kode tersebut dicari mulai dari lokasi yang didefinisikan oleh <strong><code>*sel_read_enforce</code></strong> (dari symbol kernel) hingga (<strong>+0x20</strong>) pada memory. Hal yang sama dilakukan untuk komputer 64-bit. Penjelasan pada kode tersebut sangat jelas. Sekali lagi, patching apapun mungkin jika sudah mendapatkan &#x201C;ring 0&#x201D;.</p>
<p>Bagian selanjutnya adalah <em>gimme r00t</em>. Fungsi ini sangat umum digunakan pada local eksploit Linux, dalam eksploit spender kali ini disebut sebagai fungsi <strong><code>give_it_to_me_any_way_you_can()</code></strong>.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-fotik75jxl1m5zmpmrsmda.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="834" height="274" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-fotik75jxl1m5zmpmrsmda.png 600w, https://learning.intellibron.io/content/images/max/800/1-fotik75jxl1m5zmpmrsmda.png 834w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">fungsi ini akan memberikan uid 0 atau user root pada sistem operasi&#xA0;linux</span></figcaption></figure>
<p>Ini adalah tehnik variasi dari &#x201C;gimme r00t&#x201D;. Pada kernel linux yang dirilis<br>akhir-akhir ini terdapat fungsi untuk melakukan set credential secara langsung, berikut ini definisinya:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-cz9qi48gktdzfngm2pwvja.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="806" height="178" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-cz9qi48gktdzfngm2pwvja.png 600w, https://learning.intellibron.io/content/images/max/800/1-cz9qi48gktdzfngm2pwvja.png 806w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">fungsi commit_creds()</span></figcaption></figure>
<p>dan berikut ini implementasinya:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-oyj8wfsfau5n8lqw30k2gg.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="1398" height="1426" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-oyj8wfsfau5n8lqw30k2gg.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-oyj8wfsfau5n8lqw30k2gg.png 1000w, https://learning.intellibron.io/content/images/max/800/1-oyj8wfsfau5n8lqw30k2gg.png 1398w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">fungsi commit_creds()</span></figcaption></figure>
<p><strong><code>commit_creds()</code></strong> merupakan fungsi yang di-<em>export</em> sebagai <em>symbol</em> kedalam kernel linux, sehingga kita dapat menggunakan pemanggilan langsung (<em>fastcall</em>) dari suatu program dengan bantuan gcc.</p>
<p>Dalam <em>exploit.c</em> terdapat bagian berikut ini:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-2goiafqbce9qnlrjx6aala.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="1246" height="290" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-2goiafqbce9qnlrjx6aala.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-2goiafqbce9qnlrjx6aala.png 1000w, https://learning.intellibron.io/content/images/max/800/1-2goiafqbce9qnlrjx6aala.png 1246w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">fastcall fungsi commit_creds()</span></figcaption></figure>
<p>dengan fungsi diatas <strong><code>commit_creds()</code></strong> dan <strong><code>prepare_kernel_cred()</code></strong> merupakan variable yang memegang lokasi symbol fungsi <strong><code>commit_creds()</code></strong> serta <strong><code>prepare_kernel_cred()</code></strong> dalam memory (export dari kernel). Dengan cara inilah maka fungsi <strong><code>commit_creds()</code></strong> dapat dipanggil dari dalam exploit.c, namun tentu saja tidak semua kernel memiliki <em>symbol</em> ini, itu sebabnya pada bagian awal fungsi <strong><code>get_kernel_sym()</code></strong> termasuk<br>mencari apakah pada kernel terdapat symbol &#x201C;<strong>commit_creds</strong>&#x201D; dan<br>&#x201C;<strong>prepare_kernel_cred</strong>&#x201D;.</p>
<p>Tujuan dari fungsi<strong> <code>commit_creds()</code></strong> sudah jelas, fungsi tersebut akan memberikan <em>credential</em> yang baru pada suatu proses. Dan <em>credential</em> yang baru tersebut diminta melalui fungsi <strong>prepare_kernel_cred(0)</strong> dimana <em>credential</em> baru untuk <strong>uid=0</strong> (root) akan disiapkan. Jika berhasil, maka <em>variable</em> <strong>got_root= 1</strong> akan di-set.</p>
<p>Jika kernel yang digunakan target adalah kernel jenis lama ataupun tidak<br>memiliki fungsi <strong><code>commit_creds()</code></strong>, maka tehnik untuk mendapatkan root model lama akan dijalankan.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-qohyvtluylsacvdwkenn3g.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="1026" height="452" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-qohyvtluylsacvdwkenn3g.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-qohyvtluylsacvdwkenn3g.png 1000w, https://learning.intellibron.io/content/images/max/800/1-qohyvtluylsacvdwkenn3g.png 1026w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">tehnik mendapatkan root pada kernel lama (&lt;&#xA0;2.6.30)</span></figcaption></figure>
<p>Linux memiliki support untuk dua macam <em>kernel stack</em>, 4K dan 8K <em>kernel page </em>dalam <em>single-page</em> untuk arsitektur x86. Secara default, x86 mendukung 8K <em>kernel stacks</em>, dan ini digunakan juga oleh sistem operasi lain seperti Microsoft<br>Windows. Namun sejak kernel 2.6.6 (saya sendiri tidak yakin kapan patch untuk 4K stack dimasukan dalam kernel Linux) linux memasukan fitur ini kedalam kernel versi stabil. Pengurangan besar <em>kernel stack</em> sebesar 50% ini dipercaya dapat meningkatkan performa linux, dan telah di-implementasikan oleh distro seperti Fedora atau RedHat.</p>
<p>Mungkin kita akan bertanya-tanya mengapa untuk 4K/8K stack dibuat fungsi yang berbeda? atau mengapa antara x86 (32-bit) dan x64 (64-bit) dibuat juga fungsi yang berbeda? Jawabannya adalah alokasi memory. Alokasi sistem memory yang dilakukan oleh kernel berbeda-beda, antara 2.4 dengan 2.6 saja terdapat perbedaan <em>style</em> alokasi memory.</p>
<p>Wunderbar emporium merupakan contoh eksploit yang sudah dipoles untuk sebisa mungkin stabil dijalankan pada arsitektur 32/64 bit ataupun penggunaan kernel 2.4/2.6, sehingga eksploit ini melakukan beragam pengecekan diatas.</p>
<p>Jika pada metode pertama (commit_cred()) kita menggunakan fungsi <em>built-in</em> kernel untuk mendapatkan <em>credential root</em> (uid=0), maka pada metode kedua yang disebut <em>old-style</em> ini kita akan melakukan &#x2018;<em>patching</em>&#x2019; secara manual dengan mencari suatu lokasi memory dan kemudian mengganti isinya sehingga proses yang kita jalankan (eksploit) mendapatkan <em>credential root</em>.</p>
<p>Pertanyaan selanjutnya adalah &#x201C;apa yang kita cari?!&#x201D;. Jawaban singkat,<br>&#x201C;<strong>task_struct</strong>&#x201D;. Dalam Linux, setiap proses memiliki struktur yang disebut sebagai &#x201C;task_struct&#x201D;. Ketika suatu aplikasi / program dijalankan, dan proses / <em>thread </em>dibuat oleh kernel maka proses tersebut akan memiliki beberapa identitas seperti informasi <em>stacks</em>, <em>register</em>, <em>parent process</em>, dll. Termasuk diantaranya adalah uid dari proses tersebut. Informasi ini disimpan dalam memory secara dinamis ketika proses dibuat.</p>
<p>Proses dari eksploit yang kita jalankan tentu saja akan memiliki uid yang<br>menjalankan proses tersebut (mis: <em>apache</em>, <em>nobody</em>, <em>local user</em>, dll), dan tugas<br>dari &#x201C;gimme r00t&#x201D; adalah mencari lokasi task_struct yang berisi uid untuk<br>kemudian diganti dengan uid milik root. Mudah bukan?!</p>
<p>Kok bisa semudah itu?! Jangan lupa, bug yang kita eksploitasi ini merupakan<br>&#x201C;ring0&#x201D;, apapun perintahnya akan dijalankan :).</p>
<p>Langkah pertama tentu saja mencari lokasi dari proses saat ini, berikut ini<br>fungsi untuk x86 (4K/8K) dan x64 (8K),</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-xe5tds7lmvsumkhciqxqfg.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="1108" height="1432" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-xe5tds7lmvsumkhciqxqfg.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-xe5tds7lmvsumkhciqxqfg.png 1000w, https://learning.intellibron.io/content/images/max/800/1-xe5tds7lmvsumkhciqxqfg.png 1108w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">fungsi mencari lokasi </span><i><em class="italic" style="white-space: pre-wrap;">current process</em></i><span style="white-space: pre-wrap;"> di memory pada berbagai arsitektur</span></figcaption></figure>
<p>Ambil contoh diatas untuk x86/4K, kode awal merupakan kode inline assembly yang digunakan untuk mendapatkan isi register [ESP]. Ketika suatu proses dibuat, maka ESP (<em>Extended Stack Pointer</em>) akan menyimpan lokasi memory awal dari stack. Setiap proses akan memiliki stack tersendiri untuk menyimpan nilai yang sifatnya dinamis, dalam hal ini kita fokuskan pada nilai uid dari proses tersebut yang diberikan oleh kernel. Nilai ESP tersebut akan dimasukan pada variable <em>current</em>. Variable tersebut kemudian akan dioperasikan proses logika &#x201C;and&#x201D; dengan lokasi memory <strong>0xfffff000</strong>. Akan dilakukan pengecekan apakah nilai <em>current</em> lebih besar dari <strong>0xc0000000</strong> dan lebih kecil dari <strong>0xfffff000</strong> karena lokasi tersebut merupakan standar untuk x86/4K. Cukup jelas bukan?!</p>
<p>Setelah lokasi awal dari stack didapatkan, maka selanjutnya adalah mencari<br>posisi informasi uid disimpan,</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-esdk2u15rahwodlohrfu0a.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="1176" height="760" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-esdk2u15rahwodlohrfu0a.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-esdk2u15rahwodlohrfu0a.png 1000w, https://learning.intellibron.io/content/images/max/800/1-esdk2u15rahwodlohrfu0a.png 1176w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">mencari lokasi informasi uid (dari proses yang berjalan saat itu) disimpan pada&#xA0;memory</span></figcaption></figure>
<p>Proses pencarian dilakukan dari posisi &#x201C;<strong>current</strong>&#x201D; hingga &#x201C;(current + 0x1000 -<br>17)&#x201D;, apabila telah didapatkan posisi dalam memory yang berisi informasi uid<br>maka selanjutnya adalah mengganti nilainya dengan &#x201C;0&#x201D;. Untuk itu digunakan fungsi <strong><code>memset()</code></strong>.</p>
<p>Inilah salah satu metode lama untuk mendapatkan uid root dalam Linux. Jika<br><em>exploit.c</em> berhasil mencapai titik ini berarti tahap persiapan telah dilakukan<br>dengan baik.</p>
<p>Semua langkah diatas merupakan umpan yang akan dijalankan oleh kernel target sesaat setelah mengalami bug <em>NULL pointer dereference</em>. Sehingga langkah selanjutnya sangat sederhana: trigger bug pada kernel.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-5wakjtbf9i2feiw5by2eca.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="1210" height="1172" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-5wakjtbf9i2feiw5by2eca.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-5wakjtbf9i2feiw5by2eca.png 1000w, https://learning.intellibron.io/content/images/max/800/1-5wakjtbf9i2feiw5by2eca.png 1210w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">trigger bug sehingga eksekusi pada sistem operasi bisa di eksploitasi</span></figcaption></figure>
<p>Ada pendapat yang mengatakan bahwa &#x201C;menemukan bug lebih sulit dibandingkan sekedar menulis eksploit&#x201D;, namun ada juga yang mengatakan bahwa &#x201C;menulis eksploit (yang reliable) lebih rumit karena harus melewati beragam proteksi dari sistem dibandingkan menemukan bug yang hanya bermodalkan fuzzer&#x201D;. Well, saya tidak tahu mana yang benar namun tentu saja masing-masing ada tantangan tersendiri. Namun untuk bug kali ini para penulis eksploit tidak perlu bersusah payah karena dalam advisories-nya julien dan taviso sudah memberikan metode untuk men-trigger bug tersebut. Trigger diatas adalah implementasi dari advisories mereka. Dan domain yang akan diserang telah didefinisikan sebelumnya (bisa ditambahkan sendiri),</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-sm67o94c20elsfigtectuq.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="916" height="468" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-sm67o94c20elsfigtectuq.png 600w, https://learning.intellibron.io/content/images/max/800/1-sm67o94c20elsfigtectuq.png 916w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">vulnerable domain</span></figcaption></figure>
<p>Tidak ada yang perlu dijelaskan lebih jauh disini.</p>
<p>Sisa dari proses eksploit adalah membiarkan kernel masuk dalam perangkap <em>NULL ptr dereference</em> dan menjalankan beragam hal yang telah dipersiapkan diatas.</p>
<p>Hasilnya:</p>
<ol><li>Beragam modul LSM akan di-disable (diset 0).</li><li>Proses dari eksploit akan memiliki uid = 0 (root).</li></ol>
<p>Bagian akhir adalah tujuan dari semua ini,</p>
<pre><code class="language-c">... 
execl(&quot;/bin/sh&quot;, &quot;/bin/sh&quot;, &quot;-i&quot;, NULL);
...</code></pre>
<p>Dengan uid=0 kita akan membangkitkan program shell yang kemudian memberikan kita si cantik &#x201C;<strong>r00tsh3ll</strong>&#x201D;. Berikut contohnya pada target SuSe Linux Enterprise 9 (default instalasi tanpa <em>hardening</em>):</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-q_ecqqcuslbkdxmakbovng.png" class="kg-image" alt="Wunderbar Emporium" loading="lazy" width="1228" height="404" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-q_ecqqcuslbkdxmakbovng.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-q_ecqqcuslbkdxmakbovng.png 1000w, https://learning.intellibron.io/content/images/max/800/1-q_ecqqcuslbkdxmakbovng.png 1228w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">contoh ekspoitasi linux dengan menggunakan eksploit wunderbar_emporium</span></figcaption></figure>
<p>Inilah akhir dari proses local kernel eksploitation yang memanfaatkan <em>NULL<br>Pointer Deference</em>.</p>]]></content:encoded></item><item><title><![CDATA[Cheddar Bay]]></title><description><![CDATA[Brad Spender, sang developer Grsecurity pada tanggal 17 July 2009 merilis
eksploit yang diberi kode cheddar_bay kepada publik, salah satunya ke milis full-disclosure. ]]></description><link>https://learning.intellibron.io/lesson/cheddar-bay-course-id-11/</link><guid isPermaLink="false">68f731f3a8c70f0001058eee</guid><dc:creator><![CDATA[Muhammad Rasyid Sahputra]]></dc:creator><pubDate>Thu, 26 Oct 2023 06:19:06 GMT</pubDate><media:content url="https://learning.intellibron.io/content/images/2024/07/_e0c0ff48-d022-4bb9-b427-c862841165c8.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://learning.intellibron.io/content/images/2024/07/_e0c0ff48-d022-4bb9-b427-c862841165c8.jpeg" alt="Cheddar Bay"><p>Pada saat itu baru saja beredar bug <em>NULL pointer</em> <em>Dereference</em> untuk <em>device driver tun</em>. Bug tersebut[<a href="http://mirror.celinuxforum.org/gitstat/commit-detail.php?commit=33dccbb050bbe35b88ca8cf1228dcf3e4d4b3554&amp;ref=learning.intellibron.io" rel="noopener">10</a>] dimana merupakan <em>patch</em> tambahan dari Herbert Xu apabila dilihat secara langsung pada source kode kernel tidak akan kelihatan karena telah dilakukan pengecekan terhadap <em>NULL Pointer Dereference</em>, namun ternyata ada fakta lain yang cukup mengejutkan yaitu masalah optimisasi oleh <em>compiler</em>, dalam hal ini <strong>gcc</strong>. <strong>gcc</strong> melakukan optimisasi terhadap kode pada <em>driver tun</em> dengan menganggap bahwa pengecekan pada kode tersebut terhadap <em>NULL Pointer Dereference</em> tidak diperlukan. Berikut ini contoh kodenya (hasil <em>patch</em> dari Herbert Xu untuk<strong> tun_chr_poll()</strong> yang dimasukan ke kernel 2.6.30):</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-mbeq_gm6yhnsuxt8zm2a6q.png" class="kg-image" alt="Cheddar Bay" loading="lazy" width="1300" height="1064" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-mbeq_gm6yhnsuxt8zm2a6q.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-mbeq_gm6yhnsuxt8zm2a6q.png 1000w, https://learning.intellibron.io/content/images/max/800/1-mbeq_gm6yhnsuxt8zm2a6q.png 1300w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">driver tun pada kernel linux&#xA0;2.6.30</span></figcaption></figure>
<p>Pada baris 489 <em>variable</em> <em>pointer sk</em> di-definisikan sekaligus di-inisialisasikan<br>dengan <strong>tun-&gt;sk</strong>, <em>variable pointer tun</em> sendiri didefinisikan sekaligus di<br>insisialisasikan dengan nilai dari fungsi <strong>__tun_get()</strong> (baris 488) dengan input<br>dari <strong>tfile</strong>. Pada baris 492 dilakukan pengecekan terhadap <em>variable pointer tun</em> apakah bernilai NULL. Jika memang NULL, maka <strong>tun_chr_poll()</strong> tidak akan dilanjutkan dan keluar dari fungsi tersebut. Dalam hal ini, source kode diatas tidak bermasalah dengan <em>NULL Pointer Dereference</em>.</p>
<p>Namun pada saat di-<em>compile</em>, gcc melakukan optimisasi dan menghilangkan bagian pengecekan dibaris 492 tersebut, alasannya karena pada baris 489 <em>variable pointer tun</em> telah di-<em>dereference</em> sehingga sudah pasti nilainya tidak NULL, sehingga pengecekan dihapus untuk menjadikan hasil kompilasi lebih optimal. Hasilnya? tentu saja jika <em>tun</em> bernilai NULL maka tidak akan ada pengecekan dan fungsi diatas beresiko terkena <em>bug</em> <em>NULL pointer dereference</em>.</p>
<p>Permasalahan ini kemudian menjadi salah satu topik yang didiskusikan diantara para developer sehingga mereka kemudian sepakat untuk menghilangkan opsi optimisasi terhadap <em>null pointer</em> ketika melakukan kompilasi kernel. <em>Patch</em> pun di-<em>merge</em> untuk kode diatas[<a href="http://article.gmane.org/gmane.linux.network/124939?ref=learning.intellibron.io" rel="noopener">11</a>].</p>
<p><em>Bug tun</em> inilah yang kemudian digunakan oleh Spender untuk di-eksploitasi<br>menggunakan <em>cheddar_bay</em>. Eksploit <em>cheddar_bay</em> ternyata menguak beberapa trik eksploitasi <em>NULL Pointer Dereference</em> yang mungkin selama ini menjadi rahasia dunia <em>underground</em>. At least, itu adalah klaim Brad Spander seperti yang tertulis lengkap pada source kode <em>cheddar_bay</em>. <em>Cheddar_bay</em> juga memasukan fitur untuk me-non aktifkan beragam LSM yang mungkin diaktifkan oleh target (<em>AppArmor, Auditing, LSM</em>).</p>
<p>Namun secara khusus kita bisa mengatakan bahwa <em>cheddar_bay</em> menyerang implementasi SELinux yang seharusnya menjadi pelindung kernel terhadap serangan eksploit. Spender membuktikan dengan <em>cheddar_bay</em> bahwa mengaktifkan SELinux justru malah menambah resiko serangan terhadap bug <em>NULL Pointer Dereference</em> menjadi lebih besar. Belakangan Dan Walsh[12] juga ikut menambahkan kegagalan SELinux dalam hal melindungi kernel linux terhadap serangan eksploit. Hal ini juga dibenarkan oleh pihak pengembang SELinux bahwa sebenarnya SELinux sangat kuat terhadap serangan <em>remote exploit</em>, namun ternyata lemah terhadap serangan <em>local exploit</em>. Berarti jika suatu sistem merupakan <em>webserver</em> / <em>hosting</em> yang mengaktifkan SELinux, dan salah satu web pada hosting tersebut memiliki hole (misal: <em>SQL Injection</em>) sehingga penyerang berhasil mendapatkan akses <em>shell</em> (sebagai <em>user</em> biasa), penyerang tersebut memiliki kesempatan lebih besar untuk mendapatkan akses <em>root</em> dengan melakukan eksploitasi terhadap <em>NULL Pointer Dereference</em> dibandingkan sistem lain yang tidak mengaktifkan SELinux. SELinux merupakan produk yang digunakan oleh RedHat dan fakta ini sangat memalukan.</p>
<p>Saya tidak akan mengupas secara mendetail eksploit <em>cheddar_bay</em> karena dua alasan:</p>
<ol><li>Spender telah memberikan penjelasan yang sangat sangat panjang tentang eksploit tersebut dalam source kode <em>exploit.c</em></li><li>Fitur yang di-implementasikan oleh <em>cheddar_bay</em> juga digunakan oleh eksploit publik kedua, <em>wunderbar_emporium</em>. Sehingga penjelasan umum saya berikan pada <em>cheddar_bay</em>, namun penjelasan proses eksploitasi akan dijelaskan secara mendetail melalui <em>wunderbar_emporium</em>.</li></ol>
<iframe src="https://10.120.30.21:8080/wetty" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true">console</iframe>]]></content:encoded></item><item><title><![CDATA[Linux Security Module (LSM)]]></title><description><![CDATA[Pada pembahasan diatas beberapa kali disebutkan tentang LSM. Linux Security Module (LSM) merupakan suatu framework yang dimiliki oleh kernel linux untuk mendukung implementasi security pada kernel linux tanpa memprioritaskan implementasi dari satu pihak tertentu.]]></description><link>https://learning.intellibron.io/lesson/linux-security-module-lsm/</link><guid isPermaLink="false">68f731f3a8c70f0001058eed</guid><dc:creator><![CDATA[Muhammad Rasyid Sahputra]]></dc:creator><pubDate>Wed, 25 Oct 2023 11:53:37 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1628116626872-26d10abf60e0?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE0fHxwaW5ndWlufGVufDB8fHx8MTY5ODIzNDgwMHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1628116626872-26d10abf60e0?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE0fHxwaW5ndWlufGVufDB8fHx8MTY5ODIzNDgwMHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Linux Security Module (LSM)"><p>Pada tahun 2001 di Linux Kernel Summit, NSA memberikan proposal SELinux untuk dimasukan kedalam kernel Linux namun Linus Torvalds menolak hal tersebut dengan alasan ada beragam pendekatan security yang kala itu muncul ke permukaan namun saling tercerai berai[<a href="http://en.wikipedia.org/wiki/Linux_Security_Modules?ref=learning.intellibron.io" rel="noopener">8</a>]. Linus mengatakan bahwa komunitas security seharusnya memiliki standarisasi tersendiri untuk mendukung security dalam kernel linux dan tidak saling tercerai berai agar bisa dimasukan kedalam kernel linux. Sejak saat itu terbentuk komunitas LSM untuk pengembangan framework tersebut. Dan akhirnya LSM diterima untuk kemudian dimasukan pada kernel 2.6 tahun 2003.</p>
<p>LSM merupakan suatu framework, dan produknya berupa modul seperti AppArmor, SELinux, dan TOMOYO Linux. Namun pada perjalanannya SELinux merupakan produk paling banyak digunakan dan paling aktif pengembangannya sehingga seakan-akan LSM = SELinux.</p>
<p>Produk security untuk kernel linux yang juga sangat populer adalah Grsecurity / PaX. Grsecurity/PaX tidak termasuk dalam LSM karena menggunakan pendekatan yang berbeda untuk meningkatkan <em>security</em> pada kernel linux. Oleh karena itu hingga saat ini Grsecurity / PaX merupakan <em>project</em> <em>independent</em> yang tetap banyak digunakan oleh beragam distro (mis: <em>Gentoo Hardened</em>) namun terpisah dari LSM, sehingga implementasinya menggunakan mekanisme patch secara manual terhadap kernel linux.</p>]]></content:encoded></item><item><title><![CDATA[Bypass mmap() protection]]></title><description><![CDATA[Para hacker bidang security terus mecari cara untuk melakukan eksploitasi
terhadap bug NULL pointer dereference, ada beberapa metode yang bisa digunakan untuk dapat mengakses zero page memory seperti yang di-presentasikan oleh Gael Delalleau pada CanSecWest 2005.]]></description><link>https://learning.intellibron.io/lesson/bypass-mmap-protection/</link><guid isPermaLink="false">68f731f3a8c70f0001058eec</guid><dc:creator><![CDATA[Muhammad Rasyid Sahputra]]></dc:creator><pubDate>Wed, 25 Oct 2023 11:51:55 GMT</pubDate><media:content url="https://learning.intellibron.io/content/images/2024/07/_7aa04f01-dc3b-4933-b3a2-57ffd7f5ece6.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://learning.intellibron.io/content/images/2024/07/_7aa04f01-dc3b-4933-b3a2-57ffd7f5ece6.jpeg" alt="Bypass mmap() protection"><p>Pada <a href="http://cansecwest.com/core05/memory_vulns_delalleau.pdf?ref=learning.intellibron.io" rel="noreferrer">presentasi</a> tersebut Gael memaparkan implementasi memory allocation Linux serta beberapa sistem operasi lain, dan memaparkan berbagai kemungkinan yang bisa digunakan untuk mengontrol <em>zero page memory</em>. Cara tidak langsung (indirect) misalnya dengan memanfaatkan OOM (<em>Out Of Memory</em>) yang secara paksa melakukan alokasi <em>heap</em> besar-besaran sehingga pada satu titik alokasi <em>heap</em> akan mengisi <em>zero page memory</em>.</p>
<p>Julien Tinnes dan Tavis Ormandy dari Google Security Team melakukan riset dan menghasilkan metode-metode untuk <em>bypass</em> proteksi terhadap bug Linux <em>NULL pointer dereference</em>. Salah satu metodenya ditulis pada blog julien[<a href="http://blog.cr0.org/2009/06/bypassing-linux-null-pointer.html?ref=learning.intellibron.io" rel="noopener">7</a>].</p>
<p>Sebagaimana yang tertulis pada blog tersebut, mereka mencoba beragam cara namun hampir semua masih bisa ditangani dengan baik oleh LSM (Linux Security Module), yang notabene merupakan fitur tambahan pada kernel Linux untuk security dan salah satu tugasnya adalah melakukan pengecekan terhadap feature <strong>mmap_min_addr()</strong>.</p>
<p>Ada dua hal penting yang mereka dapatkan untuk bisa melakukan mapping pada <em>zero page memory</em> berdasarkan analisis kode kernel linux (2.6.30), yang pertama adalah trik <em>personality</em>.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-kinb1ietu58-dgw_rrdehw.png" class="kg-image" alt="Bypass mmap() protection" loading="lazy" width="1232" height="440" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-kinb1ietu58-dgw_rrdehw.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-kinb1ietu58-dgw_rrdehw.png 1000w, https://learning.intellibron.io/content/images/max/800/1-kinb1ietu58-dgw_rrdehw.png 1232w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">fitur personality pada kernel linux&#xA0;2.6.30</span></figcaption></figure>
<p>Linux menggunakan <em>personality</em> untuk melayani aplikasi user, dan pelayanan dalam hal ini adalah linux mendukung lingkungan <em>unix-like variant</em> bagi aplikasi yang membutuhkan lingkungan tersebut. Guna-nya apa?! tentu saja agar aplikasi-aplikasi yang semula dibuat untuk lingkungan non-linux namun masih termasuk unix-like variant bisa berjalan diatas linux. Diantara <em>personality</em> yang didukung adalah <strong>SVr4</strong>.</p>
<p>Jika kita set suatu <em>process</em> untuk menggunakan <em>personality</em> <em>SVr4</em>, maka kode diatas akan dijalankan. Dan dapat kita lihat secara gamblang dari komentar developer untuk kode diatas bahwa sistem <em>SVr4</em> melakukan mapping <em>zero page</em> dengan protocol <strong>read-onl</strong>y (PROT_READ), dan beberapa aplikasi membutuhkan kondisi tersebut sehingga ketika suatu proses di-set untuk menggunakan <em>personality</em> <em>SVr4</em> secara otomatis kernel linux akan melakukan mapping <em>zero page</em> dengan protocol <strong>read-only</strong>.</p>
<p>Namun <em>personality SVr4</em> tidak dapat melawan aturan fitur <em>security check</em> LSM. Trik diatas akan digagalkan oleh LSM, seperti apakah aturan LSM untuk default security check pada linux dalam hal pemanggilan fungsi <strong>mmap()</strong>?</p>
<p>Security check dilakukan oleh <strong>cap_file_mmap()</strong>, dimana kode internalnya bisa dilihat pada <strong>security/capability.c</strong> (kernel 2.6):</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-dlwjcfonj2g9xjkqvfrn-q.png" class="kg-image" alt="Bypass mmap() protection" loading="lazy" width="1232" height="418" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-dlwjcfonj2g9xjkqvfrn-q.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-dlwjcfonj2g9xjkqvfrn-q.png 1000w, https://learning.intellibron.io/content/images/max/800/1-dlwjcfonj2g9xjkqvfrn-q.png 1232w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">fitur capability pada kernel linux&#xA0;2.6.30</span></figcaption></figure>
<p>File <em>capability.c</em> berisi <em>default security module</em> pada kernel linux jika tidak<br>ada modul lain yang di-<em>load</em> untuk melindungi kernel (mis: SELinux). Fungsi<br><strong>cap_file_mmap()</strong> diatas akan mengatur proses mapping file dengan menggunakan <strong>syscall mmap()</strong>. Dan seperti yang tertulis jelas pada kode tersebut, jika <em>addr</em> yang dialokasikan nilainya kurang dari <strong>mmap_min_addr()</strong> dan tidak memiliki <em>capability</em> <strong>CAP_SYS_RAWIO</strong> maka return value-nya adalah <strong>-EACCESS</strong>. Pada contoh program sebelumnya telah kita lihat bahwa <em>restriction</em> ini akan memberikan pesan error <em>permission denied</em> (<strong>mmap_min_addr()</strong> di-set lebih dari nol).</p>
<p>Jadi, secara logika suatu proses dengan <strong>CAP_SYS_RAWIO</strong> bisa mem-<em>bypass</em> fungsi diatas dan diperbolehkan untuk melakukan <em>mapping zero page memory</em> walaupun <strong>mmap_min_addr()</strong> di-set lebih besar dari nol.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-gehl30ev0nyvgtwpzadpxg.png" class="kg-image" alt="Bypass mmap() protection" loading="lazy" width="1172" height="310" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-gehl30ev0nyvgtwpzadpxg.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-gehl30ev0nyvgtwpzadpxg.png 1000w, https://learning.intellibron.io/content/images/max/800/1-gehl30ev0nyvgtwpzadpxg.png 1172w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">CAP_SYS_RAWIO pada kernel linux&#xA0;2.6.30</span></figcaption></figure>
<p>Berdasarkan capability di Linux, proses yang memiliki <strong>CAP_SYS_RAWIO</strong><br>diperbolehkan untuk mengakses <em>ioperm</em> / <em>iopl</em> yang dalam hal ini setaraf dengan hak akses <em>root</em>. Sehingga kita membutuhkan suatu <em>binary</em> yang didalamnya memanggil fungsi <em>setuid</em> <em>root</em> sebelum dijalankan.</p>
<p>Julien dan Taviso menemukan <em>pulseaudio</em>. <em>Pulseaudio</em> melakukan <em>setuid</em> <em>root</em> ketika dijalankan untuk kemudian me-<em>load</em> <em>library</em> yang dibutuhkan melalui parameter <strong>-L.</strong> Dan ini adalah aplikasi yang sempurna untuk dapat mem-<em>bypass</em> default security diatas.</p>
<p>Dengan memanfaatkan pulseaudio, kita dapat membuat suatu kode yang melakukan set <em>personality</em> menjadi <em>SVr4</em>, kemudian memanggil <em>pulseaudio</em> untuk me-<em>load</em> suatu modul. Saat menjalankan <em>pulseaudio</em>, secara otomatis <em>page 0</em> akan di-<em>mapped</em> dan tentu saja akan berhasil karena <em>pulseaudio</em> telah memiliki akses root sehingga <strong>cap_file_mmap()</strong> akan meloloskan hal tersebut.</p>
<p>Modul yang diload oleh <em>pulseaudio</em> pun bisa kita kontrol, dalam hal ini modul tersebut berisi eksploit yang didalamnya bisa melakukan beragam hal, diantaranya melakukan <strong>mprotect()</strong> untuk mengubah <em>protocol</em> pada <em>page 0</em> agar bisa <em>read+write+execute</em> (jangan lupa, <em>SVr4</em> hanya memberikan akses <em>read</em>+<em>execute</em>). Selanjutnya <em>page 0 </em>dapat kita tulisi dengan beragam hal seperti <em>shellcode</em>, sisanya adalah mencari aplikasi yang <em>vulnerable</em> terhadap <em>NULL pointer dereference</em> dan membawa eksekusi ke <em>page 0</em> untuk kemudian menjalankan <em>shellcode</em> tersebut. <strong>Game over</strong>.</p>
<p>Metode diatas adalah satu dari beragam metode yang digunakan untuk mengontrol <em>page 0</em> dan terbukti bisa mem-<em>bypass</em> <em>restriction</em> pada kernel linux yang memanfaatkan fitur <em>mmap_min_addr()</em>.</p>]]></content:encoded></item><item><title><![CDATA[Bug, Hacker, & Developer]]></title><description><![CDATA[Programmer yang baik biasanya akan melakukan beragam test case terhadap aplikasi miliknya, hal ini dilakukan untuk melihat sejauh mana aplikasi tersebut dapat meng-handle berbagai situasi yang akan ditemukan pada saat digunakan oleh user.]]></description><link>https://learning.intellibron.io/lesson/bug-hacker-developer/</link><guid isPermaLink="false">68f731f3a8c70f0001058eeb</guid><dc:creator><![CDATA[Muhammad Rasyid Sahputra]]></dc:creator><pubDate>Wed, 25 Oct 2023 11:49:54 GMT</pubDate><media:content url="https://learning.intellibron.io/content/images/2024/07/_4f0d8b1d-2179-4658-bf67-fc003132afc5.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://learning.intellibron.io/content/images/2024/07/_4f0d8b1d-2179-4658-bf67-fc003132afc5.jpeg" alt="Bug, Hacker, &amp; Developer"><p>Jika kita mencari melalui google[<a href="http://www.google.com/search?hl=en&amp;q=linux+null+pointer+dereference&amp;ref=learning.intellibron.io" rel="noopener">5</a>] mengenai <em>NULL pointer dereference</em>, maka akan banyak sekali laporan tentang bug ini. Pada dasarnya bug tersebut adalah hal yang umum bagi programmer dimana penyebabnya adalah kekurangan proses <em>checking</em> dalam suatu aplikasi. Programmer yang baik biasanya akan melakukan beragam test case terhadap aplikasi miliknya, hal ini dilakukan untuk melihat sejauh mana aplikasi tersebut dapat meng-<em>handle</em> berbagai situasi yang akan ditemukan pada saat digunakan oleh user. Namun biasanya disebabkan oleh aplikasi yang sangat kompleks, ataupun dikarenakan berbagai macam alasan lainnya bug jenis ini tidak dapat dihindari sekalipun oleh seorang programmer tingkat tinggi.</p>
<p>Dan oleh para <em>hacker</em>, setiap bug terutama yang melibatkan <em>memory corruption</em> seperti ini selalu bisa dimanfaatkan untuk mengambil alih sistem. Hal sederhana telah kita lakukan sebelumnya dimana <strong>mmap()</strong> dapat digunakan untuk mengontrol lokasi <em>zero page memory</em>, dan oleh para <em>hacker </em>/ <em>cracker</em> bidang security hal tersebut dijadikan sebagai pintu masuk untuk mendapatkan akses yang lebih tinggi (contoh: root) ataupun merebut sistem.</p>
<p>Mekanisme logisnya sederhana, kita bisa memasukan data apapun kedalam <em>zero page memory</em> (contoh: <em>shellcode</em>), sisanya tinggal men-<em>trigger</em> <em>NULL pointer dereference</em> sehingga eksekusi akan menuju <em>zero page memory</em>, dan pada akhirnya sistem akan berada dibawah kendali kita.</p>
<p>Pada sistem komputer (khususnya intel) terdapat mekanisme untuk memisahkan antara <em>kernel proces</em>s dan <em>userland process</em>. Intel memperkenalkan mekanisme ini melalui istilah-istilah seperti <em>protected mode</em> ataupun <em>ring</em>. Intinya, dalam hal pembagian <em>resource</em> akan dilakukan pemisahan antara <em>kernel</em> <em>process</em> dan <em>user</em> <em>process</em>. Sehingga alokasi memory misalnya, antara <em>kernel process</em> dan <em>user process</em> dilakukan pemisahan hingga level <em>physical memory</em> secara eksplisit. Dengan mekanisme ini <em>resource</em> dari <em>user process</em> tidak akan pernah bisa dicampur aduk dengan resource dari <em>kernel process</em>, hal ini akan meningkatkan <em>security</em> sistem komputer.</p>
<p>Dari sisi CPU, terdapat mekanisme <em>privilege rings</em> dalam <em>protected mode</em>. CPU<br>harus masuk ke <strong>Ring 0</strong> ketika menjalankan instruksi kernel, <strong>Ring 1 / Ring 2 </strong>ketika menjalankan instruksi <em>device drivers</em>, dan <strong>Ring 3</strong> ketika menjalankan instruksi <em>userland process</em>.</p>
<p><em>NULL pointer dereference</em> jika terjadi pada <em>user process</em> mungkin tidak akan<br>terlalu berbahaya karena seperti yang telah dibahas sebelumnya, <em>zero page</em> yang di-kontrol hanya sebatas <em>zero page</em> untuk <em>user proces</em>s. Namun jika bug <em>NULL pointer dereference</em> terdapat pada kernel maka kita dapat mengambil alih sistem secara penuh. Inilah yang menjadikan bug <em>NULL pointer dereference</em> berbahaya.</p>
<p>Bug <em>NULL pointer dereference</em> bisa terjadi pada setiap sistem operasi (Windows, FreeBSD, OpenBSD, Linux, Solaris, dll), namun setiap sistem operasi memiliki strategi masing-masing dalam hal <em>memory management</em>, sehingga eksploitasi terhadap <em>NULL pointer dereference</em> pada satu sistem operasi tidak bisa di implementasikan begitu saja pada sistem operasi lainnya. Pada tahap inilah kita biasa mendengar bahwa suatu sistem operasi di klaim memiliki tingkat security yang jauh lebih baik dibandingkan sistem operasi lainnya. Sehingga tidak salah jika <strong>Theo de Raadt</strong> sang founder / developer <em>OpenBSD</em> sering menyombongkan bahwa <em>OpenBSD</em> adalah sistem operasi paling aman dan paling sulit untuk di-eksploitasi :)</p>
<p>Kembali ke Linux, kernel 2.4 dan 2.6 sendiri memiliki mekanisme yang cukup<br>berbeda pada beberapa bagian terutama memory management. Secara teknis, <em>NULL pointer dereference</em> dari <em>bug</em> kernel akan lebih sulit untuk di-eksploitasi pada kernel 2.4 dibandingkan kernel 2.6 (Linus Torvalds mengorbankan security untuk performa dan fitur yang akan bisa diusung oleh kernel 2.6), namun dikarenakan bug <em>NULL pointer dereference</em> sangat banyak maka developer kernel Linux menambahkan fitur <em>sysctl</em> <em>mmap_min_addr </em>untuk <em>Virtual Memori </em>(vm) sejak kernel 2.6.23, fungsi dari fitur ini adalah untuk me-<em>limit</em> <em>mapping</em> terhadap <strong>zero page memory</strong> oleh <em>user process</em> yang biasanya digunakan oleh para <em>hacker</em> / <em>cracker</em> untuk mengambil alih sistem saat memanfaatkan bug <em>NULL pointer dereference</em>.</p>
<p>Fitur ini cukup sederhana, kita bisa mendefinisikan sendiri lokasi minimum yang bisa digunakan oleh <strong>mmap()</strong> untuk proses <em>mapping</em>, jadi jika kita definisikan <strong>mmap_min_addr</strong> (yang juga bisa dilihat secara langsung dari file <em>/proc/sys/kernel/mmap_min_addr</em>) dengan nilai 64KB (65,536 bytes) maka aplikasi user / <em>user process</em> tidak akan diperbolehkan menggunakan <strong>mmap()</strong> untuk mapping lokasi antara 0 hingga 64KB.</p>
<pre><code class="language-bash"># sysctl -w vm.mmap_min_addr=65536 &lt;set agar bernilai 64KB&gt;
vm.mmap_min_addr = 65536</code></pre>
<p>Fitur ini terbukti dapat mempersulit eksploitasi <em>NULL pointer dereference </em>yang memanfaatkan trik <strong>mmap()</strong>.</p>]]></content:encoded></item><item><title><![CDATA[mmap() & mprotect()]]></title><description><![CDATA[Linux memiliki beberapa jenis syscall yang berhubungan dengan memory management, diantaranya adalah mmap() dan mprotect().]]></description><link>https://learning.intellibron.io/lesson/mmap-mprotect-course-id-11/</link><guid isPermaLink="false">68f731f3a8c70f0001058eea</guid><dc:creator><![CDATA[Muhammad Rasyid Sahputra]]></dc:creator><pubDate>Wed, 25 Oct 2023 11:45:37 GMT</pubDate><media:content url="https://learning.intellibron.io/content/images/2024/07/_e4cf972f-64c9-4e03-b85f-857b03e1b088.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://learning.intellibron.io/content/images/2024/07/_e4cf972f-64c9-4e03-b85f-857b03e1b088.jpeg" alt="mmap() &amp; mprotect()"><p>Dari manual pages mmap():</p>
<div class="kg-card kg-toggle-card" data-kg-toggle-state="close">
            <div class="kg-toggle-heading">
                <h4 class="kg-toggle-heading-text"><span style="white-space: pre-wrap;">SYNOPSIS</span></h4>
                <button class="kg-toggle-card-icon">
                    <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                        <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"/>
                    </svg>
                </button>
            </div>
            <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">include &lt;sys/mman.h&gt;</span></p><p><span style="white-space: pre-wrap;">void *mmap(void *addr, size_t length, int prot, int flags,</span><br><span style="white-space: pre-wrap;">int fd, off_t offset);</span></p><p><b><strong style="white-space: pre-wrap;">DESCRIPTION</strong></b><br><span style="white-space: pre-wrap;">mmap() creates a new mapping in the virtual address space of the</span><br><span style="white-space: pre-wrap;">calling process. The starting address for the new mapping is specified in addr.</span><br><span style="white-space: pre-wrap;">The length argument specifies the length of the mapping.</span><br><span style="white-space: pre-wrap;">&#x2026;</span></p></div>
        </div>
<p>syscall <strong>mmap()</strong> digunakan untuk melakukan <em>memory mapping</em> suatu file ataupun <em>object</em> ke <em>virtual memory</em>. Jadi suatu proses dapat memanggil <strong>mmap()</strong> dan kemudian melakukan <em>mapping</em> suatu <em>object</em> / <em>file</em> ke suatu lokasi di memory, dan melakukan beragam aktifitas pada <em>object</em> / <em>file</em> tersebut melalui memory. Sebagaimana yang telah didefinisikan, <strong>mmap()</strong> juga sekaligus memberikan informasi <em>protocol</em> dan <em>flags</em> dari <em>page memory</em> yang telah di-<em>mapped</em>. Data lengkap mengenai <em>protocol</em> apa saja ataupun <em>flags</em> apa saja yang bisa diberikan pada <em>page</em> tersebut bisa dibaca melalui halaman manual lengkap <strong>mmap()</strong>.</p>
<div class="kg-card kg-toggle-card" data-kg-toggle-state="close">
            <div class="kg-toggle-heading">
                <h4 class="kg-toggle-heading-text"><b><strong style="white-space: pre-wrap;">SYNOPSIS</strong></b></h4>
                <button class="kg-toggle-card-icon">
                    <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                        <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"/>
                    </svg>
                </button>
            </div>
            <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">#include &lt;sys/mman.h&gt;</span></p><p><span style="white-space: pre-wrap;">int mprotect(const void *addr, size_t len, int prot);</span></p><p><b><strong style="white-space: pre-wrap;">DESCRIPTION</strong></b><br><span style="white-space: pre-wrap;"> mprotect() changes protection for the calling process&#x2019;s memory</span><br><span style="white-space: pre-wrap;">page(s) containing any part of the address range in the interval</span><br><span style="white-space: pre-wrap;"> [addr, addr+len-1]. addr must be aligned to a page boundary.</span></p><p><i><em class="italic" style="white-space: pre-wrap;">...</em></i></p></div>
        </div>
<p><em>syscall</em> <strong>mprotect()</strong> digunakan untuk mengubah hak akses suatu <em>memory page</em>, misalnya suatu <em>memory page</em> memiliki hak akses <strong>readonly</strong> maka dengan menggunakan <strong>mprotect()</strong> kita dapat mengubah hak akses tersebut menjadi <strong>read+write</strong>.</p>
<p>Saat ini pembaca mungkin sudah bisa menebak hubungan antara <em>syscall</em> <strong>mmap()</strong> / <strong>mprotect()</strong> dengan <em>NULL pointer dereference </em>kan?! kita dapat mengubah hak akses pada <em>zero page memory </em>menggunakan <strong>mprotect()</strong> ataupun melakukan <em>mapping</em> dengan menggunakan <strong>mmap()</strong> dan kemudian memasukan nilai yang kita inginkan ke lokasi <em>zero page memory</em>.</p>
<p>Mari kita lihat contoh kode berikut ini:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-5zgxlzalh2bjvk5wpuihoa.png" class="kg-image" alt="mmap() &amp; mprotect()" loading="lazy" width="1456" height="1196" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-5zgxlzalh2bjvk5wpuihoa.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-5zgxlzalh2bjvk5wpuihoa.png 1000w, https://learning.intellibron.io/content/images/max/800/1-5zgxlzalh2bjvk5wpuihoa.png 1456w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">contoh dereference NULL pointer pada zero page&#xA0;memory</span></figcaption></figure>
<p>Program diatas jika dijalankan akan melakukan <em>NULL pointer dereference</em> seperti program sebelumnya, namun kali ini kita telah melakukan mapping dengan memanfaatkan <em>syscall</em> <strong>mmap()</strong> untuk memasukan karakter <strong>A</strong> ke lokasi <em>zero page memory</em>. Dan ketika program diatas hendak melakukan <em>NULL pointer dereference</em> (melalui fungsi <strong>fprintf()</strong>) yang secara teori akan mengakses <em>zero page memory</em>, maka tidak akan terjadi <em>segmentation fault</em> dan justru sebaliknya program akan berjalan dengan baik dan menampilkan karakter <strong>A</strong>.</p>
<p>Sebelum melangkah lebih jauh, program diatas akan berhasil dijalankan secara langsung dengan kondisi kernel linux yang digunakan adalah versi dibawah 2.6.23 (&lt; 2.6.23), jika pembaca mengalami kegagalan dengan pesan <em>Zero page<strong> </strong></em>tidak bisa<strong><em> </em><em>di-mapped: Permission denied</em></strong> maka kemungkinan besar kernel yang digunakan adalah versi diatas 2.6.23 (&gt;= 2.6.23). Saya akan memberikan penjelasan mengenai penyebab kegagalan ini beberapa saat lagi, namun untuk kali ini kamu bisa melakukan perintah berikut (sebagai &#x201C;root&#x201D;):# sysctl -w vm.mmap_min_addr=0</p>
<p>setelah melakukan perintah diatas, maka normalnya <em>zero page</em> dapat di-<em>mapped</em>. Jika masih terdapat masalah, maka kemungkinan lain adalah sistem operasi yang digunakan memiliki settingan <em>SELinux</em> ataupun <em>LSM (Linux Security Module)</em> lainnya. Silahkan cari referensi untuk menon-aktifkan konfigurasi tersebut, yang pasti pada tahap ini kita hanya melakukan pembuktian bahwa kondisi <em>NULL pointer dereference</em> dapat di-kontrol melalui <em>userland process</em>.</p>]]></content:encoded></item><item><title><![CDATA[Zero Page Memory]]></title><description><![CDATA[Setiap sistem operasi di desain berbeda dalam hal menangani NULL pointer
dereference. Pada kernel Linux, sejak dahulu telah diketahui bahwa NULL pointer dereference akan mengacu pada lokasi zero page memory.]]></description><link>https://learning.intellibron.io/lesson/zero-page-memory-course-id-11/</link><guid isPermaLink="false">68f731f3a8c70f0001058ee9</guid><dc:creator><![CDATA[Muhammad Rasyid Sahputra]]></dc:creator><pubDate>Wed, 25 Oct 2023 11:40:36 GMT</pubDate><media:content url="https://learning.intellibron.io/content/images/2024/07/_81c82313-040c-4427-be43-1e91c4cfc90b.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://learning.intellibron.io/content/images/2024/07/_81c82313-040c-4427-be43-1e91c4cfc90b.jpeg" alt="Zero Page Memory"><p>Dengan kata lain, <em>dereference</em> NULL <em>pointer</em> akan mengacu pada lokasi <strong>0x00000000</strong>.</p>
<p>Memasuki tahap ini kita membutuhkan pengetahuan mengenai manajemen memory pada sistem operasi khususnya Linux. Saya tidak akan memberikan penjelasan terlalu mendetail karena akan sangat luas sekali dan keluar dari konteks artikel, namun saya akan coba menjelaskan beberapa poin penting disini.</p>
<p>Pada arsitektur intel diperkenalkan istilah <em>virtual memory</em>. <em>Virtual memory</em><br>digunakan karena saat x86 (8086?) baru keluar kapasitas memory yang bisa<br>digunakan masih sangat terbatas, sehingga dibutuhkan suatu mekanisme oleh sistem operasi agar dapat mengalokasikan memory yang sangat terbatas tersebut untuk bisa digunakan oleh banyak program / proses. Oleh sebab itulah digunakan <em>virtual memory</em> dimana setiap proses akan merasa layaknya menggunakan <em>physical memory</em>, namun sesungguhnya memory tersebut hanyalah bentuk <em>virtual</em> yang diberikan oleh sistem operasi untuk kemudian dipetakan ke lokasi memory yang sesungguhnya.</p>
<p>Manajemen memory menggunakan istilah <em>PAGE</em>, yang merupakan satuan dalam operasi memory. Besar PAGE ini tidak sama antar arsitektur (intel, sparc, dll), namun untuk Linux yang berjalan diatas arsitektur x86 (intel) besar <em>PAGE</em> ini adalah 4KB (4,096 bytes).</p>
<p>Suatu program (file image, contohnya: ELF untuk Linux, .exe untuk Windows) akan di-<em>load</em> oleh sistem operasi kedalam <em>virtual memory</em> ini. Besar area <em>virtual memory</em> ini menggunakan satuan <em>PAGE</em> dan ditentukan oleh sistem operasi. Setiap image akan memiliki informasi yang spesifik (<em>header, code segment, data segment, stack segment, dll</em>) dan tugas sistem operasi adalah mengalokasikan informasi tersebut kedalam <em>virtual memory</em>, selanjutnya <em>processor</em> akan membaca instruksi program satu per satu pada <em>virtual memory</em> untuk menjalankan perintah-perintah program tersebut. <em>Processor</em> mengakses <em>physical memory</em> melalui <em>virtual memory</em> dengan bantuan <em>page table</em>, dan semua ini adalah tanggung jawab sistem operasi untuk menyiapkan semuanya. Penjelasan lebih mendetail dapat mengacu pada artikel &#x201C;The Linux Kernel&#x201D;[<a href="http://www.tldp.org/LDP/tlk/tlk.html?ref=learning.intellibron.io" rel="noopener">4</a>] bagian <em>memory management</em>.</p>
<p>Jika misalnya suatu program dialokasikan memory sebesar 64KB dengan ukuran <em>PAGE</em> sebesar 4KB, maka program tersebut akan memiliki ilustrasi alokasi <em>virtual memory</em> sebagai berikut:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-6u4eyptt5p40axvdyxvkew.png" class="kg-image" alt="Zero Page Memory" loading="lazy" width="1202" height="432" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-6u4eyptt5p40axvdyxvkew.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-6u4eyptt5p40axvdyxvkew.png 1000w, https://learning.intellibron.io/content/images/max/800/1-6u4eyptt5p40axvdyxvkew.png 1202w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">memory allocation untuk arsitektur intel&#xA0;32-bit</span></figcaption></figure>
<p>Setiap <em>process</em> / <em>thread</em> akan memiliki <em>virtual memory</em>-nya masing-masing, sehingga suatu <em>process</em> tidak diperbolehkan mengakses <em>virtual memory</em> dari <em>process</em> lain. Dalam sistem operasi Linux, sistem operasi akan mengatur apabila suatu aplikasi membutuhkan alokasi memory tambahan, hal ini biasanya dengan menggunakan <em>syscall</em> seperti <strong>mremap()</strong>(2).</p>
<p>Cukup tentang teori dasar <em>virtual memory</em>.</p>
<p>Dari ilustrasi diatas kita bisa lihat bahwa lokasi <strong>0x00000000</strong> pada <em>virtual<br>memory</em> yang dialokasikan untuk suatu proses disebut juga sebagai <em>Zero Page Memory</em>. Jika kita kembali pada masalah <em>NULL pointer dereference</em> diatas, maka NULL pointer akan menunjuk pada lokasi tersebut.</p>
<p>Setiap alokasi memory yang diberikan oleh sistem operasi juga memiliki semacam hak akses, jadi telah ditentukan apakah memory page tersebut hanya boleh untuk dibaca (<em>read</em>), bisa di tulisi (<em>write</em>), bisa di eksekusi (<em>execute</em>), merupakan lokasi memory yang bisa digunakan oleh dua buah <em>process</em> berbeda (<em>shared</em>), dan lain sebagainya. <em>Zero Page Memory</em> juga memiliki kriteria ini, itu sebabnya jika kita hendak mengakses begitu saja lokasi tersebut dimana telah diset hak akses tertentu maka akan terjadi &#x201C;<strong>Segmentation fault</strong>&#x201D;.</p>]]></content:encoded></item><item><title><![CDATA[NULL Pointer Dereference]]></title><description><![CDATA[NULL adalah suatu tipe data dalam bahasa C yang menunjukan bahwa suatu nilai adalah ‘kosong’. Nol (0) tidak sama dengan kosong, nol merupakan suatu nilai.]]></description><link>https://learning.intellibron.io/lesson/null-pointer-dereference-course-id-5/</link><guid isPermaLink="false">68f731f3a8c70f0001058ee8</guid><dc:creator><![CDATA[Muhammad Rasyid Sahputra]]></dc:creator><pubDate>Wed, 25 Oct 2023 11:39:05 GMT</pubDate><media:content url="https://learning.intellibron.io/content/images/2024/07/_9d59235f-9675-49dd-b744-069cd5db00ed.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://learning.intellibron.io/content/images/2024/07/_9d59235f-9675-49dd-b744-069cd5db00ed.jpeg" alt="NULL Pointer Dereference"><p>NULL banyak dipergunakan untuk beragam keperluan, diantaranya sebagai acuan untuk mengakses suatu file dimana akhir dari suatu file di-set NULL, sehingga jika suatu program membaca file tersebut dan menemukan NULL maka program tersebut akan tahu bahwa sudah mencapai akhir dari file dan berhenti proses membaca.</p>
<p>NULL banyak dipergunakan oleh proses yang menggunakan tipe data pointer,<br>beberapa contoh yang paling mudah ditemukan adalah aplikasi <em>linked</em>-<em>list</em>. Ujung suatu list umumnya diset NULL, dan proses pada list tersebut akan mengetahui bahwa akhir suatu list telah ditemukan jika telah mencapai NULL.</p>
<p><em>NULL pointer dereference</em> adalah suatu kondisi dimana proses akan men-<em>dereference</em> suatu <em>pointer</em> yang bernilai NULL.</p>
<p>Mari kita lihat 2 contoh sederhana berikut ini:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-yephiejop_a-i_7hj-3a5q.png" class="kg-image" alt="NULL Pointer Dereference" loading="lazy" width="1244" height="632" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-yephiejop_a-i_7hj-3a5q.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-yephiejop_a-i_7hj-3a5q.png 1000w, https://learning.intellibron.io/content/images/max/800/1-yephiejop_a-i_7hj-3a5q.png 1244w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">dereference NULL</span></figcaption></figure>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-lqy_avjoc7mbdlvd6mluwq.png" class="kg-image" alt="NULL Pointer Dereference" loading="lazy" width="1200" height="706" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-lqy_avjoc7mbdlvd6mluwq.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-lqy_avjoc7mbdlvd6mluwq.png 1000w, https://learning.intellibron.io/content/images/max/800/1-lqy_avjoc7mbdlvd6mluwq.png 1200w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">dereference pointer&#xA0;NULL</span></figcaption></figure>
<p>Pada contoh pertama, kita memberikan suatu nilai NULL kedalam suatu variable dan melakukan <em>pointer dereference</em> untuk mengakses data tersebut. Saat program dijalankan maka tidak memberikan hasil apapun, hal ini disebabkan NULL adalah &#x2018;kosong&#x2019; dan ketika diakses hasilnya adalah&#x2026;well, kosong :)</p>
<p>Pada contoh kedua, terjadi suatu hal menarik. Program tersebut mendefinisikan suatu pointer sebagai NULL, dan apa yang terjadi ketika program tersebut berusaha untuk men-<em>dereference</em> NULL? hasilnya adalah &#x201C;<strong>Segmentation fault</strong>&#x201D;.</p>
<p><strong>Segmentation fault</strong> adalah kondisi dimana sistem operasi akan men-<em>terminate</em> suatu aplikasi karena berusaha mengakses bagian terlarang dari memory. Kondisi ini bisa diakibatkan misalnya ketika suatu aplikasi hendak menulis lokasi dimemory yang telah diset sebagai <strong>read only</strong>, atau berusaha mengakses (execute) bagian memory yang telah diset <strong>read write.</strong> <strong>Segmentation fault</strong> pada <em>NULL pointer dereference</em> memiliki alasan yang bisa dikatakan sama, dan penjelasan mendetail akan diberikan pada sub-bagian berikutnya. Namun yang pasti pada tahap ini kita telah memahami bahwa <em>NULL pointer dereference</em> akan mengakibatkan <strong>segmentation fault</strong> dan membuat aplikasi di-terminate (berhenti) oleh sistem operasi.</p>]]></content:encoded></item><item><title><![CDATA[Pointer & Bahasa C]]></title><description><![CDATA[Dalam bahasa pemrograman C, pointer merupakan suatu tipe data yang nilainya menunjuk lokasi dari suatu nilai dalam memory. Dua istilah penting yang harus dipahami terlebih dahulu adalah Reference dan Dereference.]]></description><link>https://learning.intellibron.io/lesson/pointer-bahasa-c-course-id-5/</link><guid isPermaLink="false">68f731f3a8c70f0001058ee7</guid><dc:creator><![CDATA[Muhammad Rasyid Sahputra]]></dc:creator><pubDate>Wed, 25 Oct 2023 11:36:33 GMT</pubDate><media:content url="https://learning.intellibron.io/content/images/2024/07/_ede9b1bc-53ce-4ab5-8458-fbe7ce66b645.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://learning.intellibron.io/content/images/2024/07/_ede9b1bc-53ce-4ab5-8458-fbe7ce66b645.jpeg" alt="Pointer &amp; Bahasa C"><p>Dalam suatu kode bahasa C:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-fdfhmwrinpknkc1mdae-ow.png" class="kg-image" alt="Pointer &amp; Bahasa C" loading="lazy" width="940" height="428" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-fdfhmwrinpknkc1mdae-ow.png 600w, https://learning.intellibron.io/content/images/max/800/1-fdfhmwrinpknkc1mdae-ow.png 940w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">contoh kode dalam bahasa C yang menggunakan tipe data&#xA0;pointer</span></figcaption></figure>
<p>Pada contoh program diatas, huruf di-inisialisasi sebagai suatu variabel yang<br>dapat menyimpan suatu data dalam memory, dalam hal ini tipe data yang dapat disimpan adalah <strong>char</strong> (8 bit). Sedangkan <strong>p</strong> merupakan suatu variable dengan tipe data <em>pointer</em>. Program diatas akan memberikan nilai &#x2018;<strong>A</strong>&#x2019; pada variable <strong>huruf</strong> dan memberikan alamat lokasi variable huruf dalam memory kepada variable <strong>p</strong>. Hal ini merupakan teori dasar dalam pemrograman bahasa C.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-hbfxkd1l4x7lwrkx4jk6xq.png" class="kg-image" alt="Pointer &amp; Bahasa C" loading="lazy" width="710" height="194" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-hbfxkd1l4x7lwrkx4jk6xq.png 600w, https://learning.intellibron.io/content/images/max/800/1-hbfxkd1l4x7lwrkx4jk6xq.png 710w"><figcaption><span style="white-space: pre-wrap;">running program pointer_memory.c</span></figcaption></figure>
<p>Dari contoh diatas kita menggunakan variable <strong>p</strong> untuk me-<em>reference</em> dan<br>me-<em>dereference</em> variable <strong>huruf</strong>. Variable <strong>p</strong> me-<em>reference</em> lokasi variable<br><strong>huruf</strong> dalam memory yang nilainya adalah 0xbffff3f7, dan variable <strong>p</strong><br>men-<em>dereference</em> variable <strong>huruf</strong> yang nilainya adalah <strong>A</strong>.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-bus2fn7ovh0yzqrcnbvgka.png" class="kg-image" alt="Pointer &amp; Bahasa C" loading="lazy" width="1142" height="288" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-bus2fn7ovh0yzqrcnbvgka.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-bus2fn7ovh0yzqrcnbvgka.png 1000w, https://learning.intellibron.io/content/images/max/800/1-bus2fn7ovh0yzqrcnbvgka.png 1142w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">pengertian &#x201C;reference&#x201D; dan &#x201C;dereference&#x201D; suatu variable dalam&#xA0;memory</span></figcaption></figure>
<p>Ilustrasi diatas menunjukan lebih jelas bahwa <strong>variable p</strong> yang berlokasi di<br>0xbffff3f0 berisi data 0xbffff3f7 yang merupakan lokasi variable <strong>huruf</strong> dalam memory.</p>
<p>Saya harap penjelasan singkat tersebut bisa menjelaskan makna <em>Reference</em> dan <em>Dereference</em> dari suatu tipe data pointer dalam bahasa C. Pemahaman ini sangat penting karena akan menjadi dasar pengetahuan hingga akhir artikel.</p>
<p>Berikut ini contoh kode dalam bahasa C yang juga memainkan fungsi pointer:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-jm2hd4vd-dnhvtrfkcdcva.png" class="kg-image" alt="Pointer &amp; Bahasa C" loading="lazy" width="1048" height="628" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-jm2hd4vd-dnhvtrfkcdcva.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-jm2hd4vd-dnhvtrfkcdcva.png 1000w, https://learning.intellibron.io/content/images/max/800/1-jm2hd4vd-dnhvtrfkcdcva.png 1048w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">source code C yang menunjukan cara dereference suatu&#xA0;pointer</span></figcaption></figure>
<p>berikut ini hasil kompilasi dan running program diatas.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://learning.intellibron.io/content/images/max/800/1-56qq1fa8fr7pwf0not43yg.png" class="kg-image" alt="Pointer &amp; Bahasa C" loading="lazy" width="1162" height="186" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-56qq1fa8fr7pwf0not43yg.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-56qq1fa8fr7pwf0not43yg.png 1000w, https://learning.intellibron.io/content/images/max/800/1-56qq1fa8fr7pwf0not43yg.png 1162w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">mengeluarkan output dari suatu array dengan menggunakan dereference</span></figcaption></figure>
<p>Program diatas menunjukan pointer <em>dereference</em> dari variable <strong>array</strong>. Variable <strong>array</strong> merupakan suatu variable yang mengalokasikan data sebanyak 5 buah dengan tipe <strong>char</strong> ( 1 byte = 8 bit). Variable <strong>pointer</strong> akan men-<em>reference</em> kan lokasi variable <strong>array</strong> dalam memory, hal ini tergantung dari bagaimana kita men-<em>reference</em> kan lokasi variable array. Pada contoh diatas, variable <strong>pointer</strong> akan menunjuk pada lokasi data pertama variable <strong>array</strong> di-memory.</p>
<p>Untuk mendapatkan data yang berada diposisi ketiga dalam variable array dapat memanfaatkan pointer <em>dereference</em>, syntax<strong> *(pointer+3)</strong> digunakan untuk kebutuhan tersebut. Angka tiga pada saat men-<em>dereference</em> variable pointer merupakan <strong>(3 * 1 byte)</strong> dari posisi awal variable array, proses ini tergantung pada inisialisasi variable pointer dimana pada program diatas bertipe <strong>char</strong> (1 byte).</p>
<p>Jadi untuk mengakses data <strong>A</strong> diatas bisa melalui 2 cara yaitu melalui variable <strong>array</strong> secara langsung ataupun melalui <strong>derefence</strong> dari suatu <em>pointer</em>. Dengan ini maka kita sepakat bahwa <em>syntax</em> berikut akan memberikan data yang sama,</p>
<figure class="kg-card kg-image-card"><img src="https://learning.intellibron.io/content/images/max/800/1-azwrwytmwawcifaihdtoig.png" class="kg-image" alt="Pointer &amp; Bahasa C" loading="lazy" width="1036" height="106" srcset="https://learning.intellibron.io/content/images/size/w600/max/800/1-azwrwytmwawcifaihdtoig.png 600w, https://learning.intellibron.io/content/images/size/w1000/max/800/1-azwrwytmwawcifaihdtoig.png 1000w, https://learning.intellibron.io/content/images/max/800/1-azwrwytmwawcifaihdtoig.png 1036w" sizes="(min-width: 720px) 720px"></figure>
<p>Good. Cukup tentang pointer, jika masih ada yang masih belum paham silahkan pelajari bahasa C dari beragam referensi di internet.</p>]]></content:encoded></item><item><title><![CDATA[Intro]]></title><description><![CDATA[Setelah tahun 2008 silam bug yang dipublish oleh Dan Kaminsky (bailiwicked dns attack) memunculkan buzz dimana-mana, maka menjelang akhir tahun 2009  sepertinya bug NULL pointer dereference pada kernel Linux yang ramai dibicarakan oleh berbagai pihak.]]></description><link>https://learning.intellibron.io/lesson/intro-course-id-11/</link><guid isPermaLink="false">68f731f3a8c70f0001058ee6</guid><dc:creator><![CDATA[Muhammad Rasyid Sahputra]]></dc:creator><pubDate>Wed, 25 Oct 2023 11:31:12 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1503444200347-fa86187a2797?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIwfHxoYWNraW5nfGVufDB8fHx8MTY5ODIyNDE5Nnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1503444200347-fa86187a2797?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIwfHxoYWNraW5nfGVufDB8fHx8MTY5ODIyNDE5Nnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Intro"><p>Beragam diskusi menarik seputar eksploitasi kernel linux dimulai semenjak Brad Spender merilis eksploit yang diberi nama <em>cheddar bay</em>. Eksploit ini menguak beberapa hal penting yang mungkin bagi kalangan <em>security / underground</em> sering disebut sebagai <strong>0day technique</strong>, dan kemudian dibahas oleh para developer linux, salah satunya dapat dilihat pada LWN[<a href="http://lwn.net/Articles/342330/?ref=learning.intellibron.io" rel="noopener">1</a>][<a href="http://lwn.net/Articles/342420/?ref=learning.intellibron.io" rel="noopener">2</a>].</p>
<p>Eksploitasi pada kernel Linux ini memanfaatkan bug <em>NULL Pointer Dereference</em>, walaupun mungkin ada beberapa jenis bug lain yang juga menarik dan muncul ke permukaan akhir-akhir ini[<a href="http://kernelbof.blogspot.com/?ref=learning.intellibron.io" rel="noopener">3</a>] namun pembahasan kita kali ini terbatas pada jenis bug <em>Null Pointer Dereference</em>. Pada artikel ini pembahasan akan dimulai dari teori awal hingga mekanisme eksploitasinya dan juga disertai dengan pembahasan singkat mengenai eksploit yang beberapa minggu terakhir ini banyak digunakan oleh publik.</p>
<p>Sebelumnya saya tekankan bahwa target sistem operasi pada pembahasan ini adalah Linux, yang berarti kernel dari sistem operasi berbasis Linux. Saat tulisan ini dibuat (tahun 2009), versi stabil terakhir dari kernel linux adalah 2.6.30.5 (v2.6) dan 2.4.37.5 (v2.4). Seluruh contoh kode dalam artikel ini telah ditest sebelumnya menggunakan kernel 2.6.30.3 (distro: Gentoo Linux) dan kernel 2.6.5 (distro: SuSe 9 Enterprise).</p>
<p>Penggunaan kernel dari tree 2.4 tidak dilakukan untuk mempersempit area diskusi artikel ini agar tidak melebar terlalu jauh, sehingga uji coba menggunakan kernel 2.4 akan diserahkan kepada pembaca :).</p>]]></content:encoded></item><item><title><![CDATA[Berkenalan Dengan Bug Null Pointer Dereference [Versi Lawas]]]></title><description><![CDATA[Bug Null Pointer Dereference merupakan salah satu kelas bug lawas yang masih tetap exist hingga saat ini. Bug ini berkaitan erat dengan bahasa C yang merupakan fondasi awal dari berbagai macam bahasa pemrograman dan juga framework yang digunakan oleh aplikasi. ]]></description><link>https://learning.intellibron.io/course/berkenalan-dengan-bug-null-pointer-dereference/</link><guid isPermaLink="false">68f731f3a8c70f0001058ee5</guid><category><![CDATA[Software Exploitation]]></category><dc:creator><![CDATA[Muhammad Rasyid Sahputra]]></dc:creator><pubDate>Wed, 25 Oct 2023 11:27:07 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1541728472741-03e45a58cf88?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fGhhY2tpbmd8ZW58MHx8fHwxNjk4MjI0MTk2fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1541728472741-03e45a58cf88?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fGhhY2tpbmd8ZW58MHx8fHwxNjk4MjI0MTk2fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Berkenalan Dengan Bug Null Pointer Dereference [Versi Lawas]"><p>Memahami konsep bug ini akan sangat membantu meningkatkan kemampuan software developer dalam menulis program, ataupun bagi para pelaku dunia industri IT Security terutama dalam rangka melakukan audit pada aplikasi yang dikembangkan oleh tim software developer. </p>
<p>Banyak bagian dari course ini telah saya rilis pertama kali  untuk majalah elektronik salah satu komunitas keamanan siber di Indonesia beberapa tahun silam. Saya tulis kembali dalam format baru dengan tujuan memperkenalkan bug NULL Pointer Dereference terutama bagi pemula. </p>]]></content:encoded></item></channel></rss>