- Komunitas kernel Linux sejak lama tidak menyukai modul kernel proprietary, dan patch Christoph Hellwig merupakan langkah untuk kembali mempersempit celah pintasnya
- Kernel tidak melarang pemuatan modul proprietary itu sendiri, tetapi melalui GPL-only exports membatasi akses ke sebagian simbol kernel hanya untuk modul yang kompatibel dengan GPL
- Pada 2020, terungkap metode GPL condom, yaitu modul GPL menjadi penghubung antara modul proprietary dan kernel; setelah itu, modul yang menggunakan simbol proprietary juga diubah agar diperlakukan sebagai proprietary
- Celah pintas baru memakai
symbol_get()untuk mendapatkan alamat simbol internal modul proprietary tanpa prosedur import normal, dan Hellwig menilai NVIDIA telah mengubah kodenya agar menggunakan cara ini - Patch yang diusulkan membuat
symbol_get()gagal saat mencari simbol yang bukan GPL-only, sehingga menutup celah pintas tersebut; namun selama modul berjalan di ruang alamat kernel, sulit membuat kontrol akses benar-benar aman
Ketegangan lama seputar modul kernel proprietary
- Komunitas kernel Linux selama ini tidak memiliki hubungan yang mulus dengan penyedia modul kernel proprietary
- Modul seperti ini sulit di-debug atau diperbaiki oleh siapa pun selain pembuatnya
- Banyak pengembang menganggapnya sebagai pelanggaran lisensi kernel dan hak cipta kode
- Meski begitu, modul proprietary tetap diizinkan dalam batas tertentu
- Patch terbaru Christoph Hellwig adalah upaya untuk sedikit mempersempit batas izin tersebut
Upaya pelarangan pemuatan pada 2006 dan GPL-only exports
- Pada 2006, sempat ada upaya singkat untuk melarang sepenuhnya pemuatan modul kernel proprietary
- Linus Torvalds menghentikan upaya itu karena beberapa alasan
- Tindakan sekadar memuat modul proprietary ke kernel Linux itu sendiri bukan pelanggaran hak cipta
- Pengguna Linux boleh melakukan hal tersebut
- Torvalds menilai larangan seperti itu bisa menjadi sinyal bahwa perhatian lebih tertuju pada perdebatan lisensi daripada peningkatan teknis
- Distribusi modul proprietary dapat menjadi pelanggaran hak cipta jika modul tersebut merupakan karya turunan dari kode kernel
- Namun, apakah sesuatu merupakan karya turunan itu ambigu, dan kernel sendiri sulit benar-benar membuat penilaian tersebut
- Kernel memiliki mekanisme lama untuk memblokir modul yang berpotensi melanggar, yaitu GPL-only exports
- Modul kernel harus mengakses simbol fungsi dan struktur data yang diekspor kernel agar bisa melakukan hal yang berguna
- Banyak simbol hanya diizinkan untuk modul yang menyatakan lisensi kompatibel GPL
- Cara ini menjauhkan modul proprietary dari sebagian besar fungsi kernel
Maksud dan realitas penandaan GPL-only
- Secara teori, penandaan GPL-only berarti suatu simbol terikat erat dengan bagian internal kernel, sehingga kode yang menggunakannya pasti merupakan karya turunan dari kernel
- Dalam praktiknya, para pengembang tidak melakukan analisis hukum semacam itu
- Biasanya mereka juga tidak memiliki kualifikasi untuk melakukan analisis tersebut
- Dalam kenyataan, menandai simbol sebagai GPL-only sering dipakai sebagai sarana untuk membuat modul proprietary secara umum menjadi lebih sulit
Metode pintas perantara yang terungkap pada 2020
- Para pembuat modul proprietary sejak lama mencari cara untuk mengakali pembatasan GPL-only exports
- Ada juga cara dengan menyatakan lisensi kompatibel GPL secara palsu, tetapi perusahaan secara naluriah menghindarinya karena tampak seperti pengakuan atas kesalahan yang jelas
- Salah satu cara yang lebih halus terungkap pada 2020 dalam proses set patch terkait peer-to-peer DMA
- Dalam struktur ini, modul yang menyatakan lisensi kompatibel GPL menjadi perantara
- Modul tersebut dapat mengakses semua simbol yang diekspor kernel
- Jika kemudian mengimpor simbol dari modul proprietary, kode proprietary bisa mengakses fungsi kernel yang dibutuhkannya
- Ini adalah variasi dari metode yang kerap disebut GPL condom
Patch penanggulangan pada 2020
- Saat itu, Hellwig menggabungkan patch yang membuat metode ini lebih sulit dilakukan
- Pada kernel saat ini, modul yang menggunakan simbol dari modul proprietary juga diperlakukan sebagai proprietary
- Modul tersebut langsung kehilangan kemampuan mengakses simbol GPL-only
- Jika mencoba mengimpor simbol modul proprietary setelah sebelumnya menggunakan simbol GPL-only, prosesnya akan gagal
- Pemeriksaan ini menutup jalan bagi modul GPL untuk bertindak sebagai perantara antara modul proprietary dan kernel
Celah pintas baru melalui symbol_get()
- Kernel menyediakan makro
symbol_get(), sementara pekerjaan sebenarnya dilakukan oleh__symbol_get() - Fungsi ini mencari alamat yang terkait dengan simbol kernel
symbol_get()sudah ada di kernel sejak rilis 2.5.48 pada 2002, dan ditambahkan dalam proses penggantian besar-besaran module loader- Ada juga batasan penting
- Hanya mencari simbol yang disediakan oleh modul yang dapat dimuat
- Penggunaannya ditujukan agar modul-modul yang saling terkait erat dapat menangani kemungkinan salah satu modul belum dimuat, tanpa membuat loop referensi
- Dari luar, karena tidak bisa dipakai untuk menemukan lokasi simbol kernel GPL-only, fungsi ini tampak tidak terlalu membantu vendor modul proprietary yang ingin mengakali aturan
Bagaimana symbol_get() mengakali pertahanan 2020
symbol_get()dapat digunakan untuk mendapatkan alamat modul proprietary tanpa melewati mekanisme import normal dan batasannya- Karena itu, perbaikan 2020 bisa diakali lagi
- Modul yang secara nominal berlisensi GPL dapat memanggil modul proprietary
- Modul proprietary itu dapat mengakses fungsi kernel yang dibutuhkannya
- Hellwig menilai bahwa NVIDIA telah memodifikasi kodenya untuk menggunakan cara pintas ini
Perubahan perilaku dalam set patch baru
- Hellwig mengirim set patch untuk kembali menutup lubang ini, dan kemudian juga mengajukan revisi
- Perubahan utamanya adalah mengubah perilaku
symbol_get()- Jika simbol yang dicari tidak ditandai sebagai GPL-only, pencarian gagal
- Ini adalah pemeriksaan dengan arah berlawanan dari cara biasa yang menolak akses ke simbol GPL-only
- Alasannya,
symbol_get()pada awalnya merupakan fungsi untuk kerja sama tingkat rendah jauh di dalam kernel, dan di area tersebut semuanya diharapkan GPL-only - Sebagian penggunaan yang sudah ada di dalam kernel menargetkan simbol yang belum ditandai GPL-only
- Set patch ini juga mencakup perubahan untuk mengubah simbol dalam kasus tersebut menjadi GPL-only
Dampak dan batasan yang diperkirakan
- Perubahan
symbol_get()ini membuat modul kernel berlisensi GPL tidak lagi bisa menyelesaikan simbol internal modul proprietary melaluisymbol_get() - Jika perubahan ini masuk ke rilis mainline dan turun sampai ke distribusi, pengembang modul proprietary harus mencari cara lain untuk mendapatkan akses internal kernel yang mereka butuhkan
- Karena maintainer modul Luis Chamberlain telah menerapkan perubahan ini, peluangnya untuk akhirnya masuk mainline tampak cukup baik
- Konflik ini sudah berlangsung lama, dan tidak kecil kemungkinan para penulis modul proprietary akan menemukan cara lain untuk mengakali maksud komunitas kernel
- Terlepas dari proprietary atau tidak, modul berjalan di ruang alamat kernel
- Permukaan serangan yang dapat dimanfaatkan modul untuk mengakali kebijakan akses simbol kernel sangat besar
- Area ini sulit dilindungi sepenuhnya
- Secara realistis, hal terbaik yang bisa dilakukan adalah terus membuat distributor modul kernel khusus biner merasa tidak nyaman sehingga mereka membuat solusi berlisensi bebas
- Cara ini tidak sempurna, tetapi selama bertahun-tahun sering terbukti efektif
1 komentar
Opini Hacker News
Kode linker kernel Linux dirancang untuk memaksakan tafsir Linus Torvalds tentang bagaimana GPL dan pengecualian system call seharusnya bekerja, jadi tampaknya ada ruang hukum untuk berargumen bahwa Nvidia telah melakukan pengelakan perlindungan hak cipta (DMCA 1201)
Linus kemungkinan besar tidak akan benar-benar melakukannya, dan jika dilakukan itu juga akan cukup mengerikan bagi seluruh ekosistem FOSS, tetapi mengingat apa saja yang telah dilakukan Nvidia selama ini, rasanya ingin juga melihatnya sekali
Jika bahkan Linux, gorila 800 pon di ruangan itu, tidak punya kemauan untuk pergi ke pengadilan, prospek proyek-proyek lain juga tidak terlihat cerah
Jika Linux hanya akan memakai tekanan teknis yang “lunak” terhadap pelanggaran lisensi dan hak cipta yang terang-terangan oleh perusahaan besar, rasanya lebih baik menganggap GPL sudah selesai dan pindah ke BSD3 atau MIT+Apache
LLVM tidak memakai copyleft yang kuat, dan mendorong kerja sama upstream lewat cara-cara teknis murni seperti perubahan API dan tempo pengembangan yang sangat cepat; itu bekerja cukup baik tanpa mengencerkan lisensi yang dipilih
Gugatan balik yang bisa benar-benar merugikan peluang bisnis Nvidia dapat bekerja dengan baik sebagai penangkal untuk mencegah masalah di masa depan
Kira-kira, “karena symbol_get sejak awal hanya ditujukan untuk modul-modul yang bekerja sama erat dan memakai simbol yang sangat internal, logis untuk membatasinya agar hanya dipakai pada EXPORY_SYMBOL_GPL dan membantu Nvidia menghindari gugatan mahal soal pengelakan kontrol akses DMCA”; ini sindiran yang sangat bagus terhadap Nvidia yang terang-terangan mengabaikan niat dan pertimbangan itu lalu berbuat sesukanya
Boleh bermimpi :)
[1]: https://www.youtube.com/watch?v=tQIdxbWhHSM
Linus tidak punya kewenangan khusus
Komentar yang ditinggalkan penulis patch ini benar-benar unik
https://lore.kernel.org/lkml/20230731083806.453036-6-hch@lst...
Di sana tertulis kira-kira “karena symbol_get sejak awal hanya ditujukan untuk modul-modul yang bekerja sama erat dan memakai simbol yang sangat internal, logis untuk membatasinya agar hanya dipakai pada EXPORY_SYMBOL_GPL dan membantu nvidia menghindari gugatan mahal soal pengelakan kontrol akses DMCA”
Ini secara harfiah merupakan upaya untuk mengklaim perlindungan ketentuan anti-pengelakan DMCA, yang membuat pengelakan DRM ilegal, terhadap kernel Linux yang merupakan proyek open source
Pada saat yang sama, ini juga secara implisit mengakui bahwa EXPORT_SYMBOL_GPL jelas merupakan skema DRM
Secara pribadi saya tidak menyukai NVIDIA dan tidak berniat membela perilaku mereka, tetapi mengejutkan melihat proyek Linux berargumen bahwa hukum anti-pengelakan DRM juga berlaku untuk proyek open source
Itu adalah salah satu hukum yang hampir secara universal ditentang komunitas open source, dan skema DRM apa pun tampak cukup bertentangan dengan nilai-nilai FOSS
Tujuan inti GPL sendiri adalah menggunakan hukum hak cipta untuk melawan hukum hak cipta, yaitu copyleft
Semakin kuat hukum hak cipta, semakin kuat pula perlindungan GPL, jadi memanfaatkan legislasi hak cipta tambahan untuk melindungi perangkat lunak open source menurut saya cukup sejalan dengan semangat GPL
GPL bukan lisensi permisif, melainkan lisensi copyleft yang kuat, dan punya daya penegakan nyata
Mekanisme kontaminasi itu bukan kemunafikan, melainkan open source; jika kodenya GPL, Anda bisa melakukan apa pun yang Anda inginkan
Secara harfiah, itu adalah perangkat yang memaksakan klausul linking dalam lisensi GPL
Saat diperlukan, hukum itu harus digunakan, jadi ini sama sekali tidak terasa aneh
Jika setelah melakukan hal mencurigakan mereka masih diberi kesempatan menyelamatkan muka selembut ini, itu termasuk beruntung
DRM untuk mencegah penyalahgunaan GPL tampak seperti langkah logis berikutnya
Saya tidak mengerti mengapa driver proprietari tidak boleh berinteraksi dengan kernel bebas
Linux secara harfiah mengimplementasikan DRM tingkat kernel, justru hal yang dulu disumpah akan dihancurkan oleh perangkat lunak bebas
Setidaknya, tuntutan agar driver proprietari tidak bisa berinteraksi dengan kode khusus GPL, menurut saya lebih mirip EULA
Jika hanya GPLv2, modul proprietari mungkin akan dianggap melanggar
Namun karena Linus secara eksplisit menyatakan bahwa system call tidak memicu copyleft GPL, simbol kernel yang termasuk system call juga tidak memicu copyleft GPL
Jadi, agar bisa menghindari pelanggaran lisensi sesuai interpretasi pengecualian GPL dari Linus, dibutuhkan loader yang memeriksa data lisensi untuk menentukan simbol mana yang boleh dan tidak boleh di-link
Ini memang DRM tingkat kernel[0], dan mungkin saja ada ruang bagi Linus untuk mengajukan klaim hukum terhadap pengelakan perlindungan salinan oleh Nvidia
GPLv3 secara eksplisit menolak perlindungan salinan apa pun di dalam kode yang dicakupnya, sehingga secara teori bisa mencegah gugatan semacam ini, tetapi klausul tersebut belum pernah diuji di pengadilan, dan Linus sangat tidak menyukai GPLv3 khususnya karena menambahkan klausul TiVo[1]
Fitur ini diimplementasikan puluhan tahun lalu, dan tujuan awalnya adalah agar mereka tidak menerima laporan bug bahwa kernel Linux crash akibat modul proprietari yang tidak bisa diperbaiki
Penegakan GPL adalah efek samping
[0] Jangan bingung dengan DRM lain di dalam kernel, yaitu Direct Rendering Manager
[1] Bukan karena ia tidak menyukai klausul TiVo itu sendiri, melainkan karena ia tidak suka syarat ditambahkan secara retroaktif ke perangkat lunak v2 dan mengubah ketentuan transaksi. Karena terasa seperti Linux diambil alih oleh FSF
Hanya saja, mereka harus menggunakan fitur sistem operasi yang cukup umum dan bisa ditemukan di banyak kernel serupa
Driver semacam itu, yang tidak bergantung pada fitur khusus Linux, tidak bisa dianggap sebagai “karya turunan” dari kernel Linux, sehingga bisa memilih lisensi apa pun yang diinginkan
Sebaliknya, driver yang memakai antarmuka khusus kernel Linux yang tidak ada di sistem operasi lain, bahkan tidak ada di kernel turunan Unix lain, menurut definisi lebih dekat dengan “karya berbasis program” dari kernel, sehingga harus dilisensikan dengan cara serupa
Lihat teks GPL-2 yang diikuti kernel
https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
LGPL ada secara terpisah untuk mengizinkan linking terpisah antara perangkat lunak bebas dan perangkat lunak proprietari, dan hal itu dilarang dalam GPL
Namun karena Linux memakai GPL-2, izin tambahan semacam itu tidak berlaku
Jika driver Nvidia hanya memakai API kernel yang umum, itu akan baik-baik saja, tetapi kenyataannya tidak demikian
Karena mereka mencoba memakai API khusus Linux yang ditandai untuk digunakan oleh driver berlisensi kompatibel GPL dalam keadaan non-GPL, itu jelas merupakan pelanggaran terhadap lisensi perangkat lunak bebas yang dipakai Linux
Mengapa perangkat lunak proprietari boleh menikmati semua manfaat perangkat lunak bebas tanpa mengikuti aturan apa pun, sementara perangkat lunak bebas harus diam saja?
Masyarakat demokratis pun punya mekanisme yang membatasi ekspresi sampai tingkat tertentu untuk melindungi dirinya sendiri
Sistem operasi proprietari sudah banyak, dan sama sekali tidak peduli soal hal seperti itu
Apakah tidak boleh ada sistem operasi yang peduli pada prinsip semacam itu? Apakah semuanya harus menjadi alat yang dingin dan ramah industri tanpa pertimbangan manusiawi?
Maksud lisensinya adalah agar segala sesuatu yang di-link dan dimuat ke kernel didistribusikan dengan lisensi copyleft yang kompatibel
Tuntutan agar kode proprietari tidak “menyertakan” kode GPL adalah GPL itu sendiri, dan merupakan tujuan utama GPL
Namun, sejauh mana sekadar linking ke API dianggap pelanggaran masih bisa diperdebatkan
Putusan ke arah mana pun tampaknya mungkin, dan penilaian seperti itu akan berdampak besar pada GPL
Karena kode Nvidia berjalan di ring0, berdasarkan pengalaman ada jauh lebih banyak trik menarik yang bisa dipakai Nvidia, tetapi saat ini mereka mungkin sedang menahan diri
Para pengembang Linux juga demikian
Pertarungan DRM bodoh seperti ini tidak membantu siapa pun, dan hanya makin mendorong permainan kucing-kucingan yang membuang waktu semua orang
“Teman-teman, akurlah”
Saya tidak mengerti mengapa Nvidia berusaha begitu keras mempertahankan drivernya sebagai gumpalan biner proprietari
Perangkat lunak bukan inti pertahanan mereka, dan Nvidia adalah perusahaan perangkat keras
Membuka modul kernel bukan hanya tidak akan memengaruhi penjualan perangkat keras, tetapi juga bisa meningkatkan stabilitas dan membuat para developer yang sengaja beralih untuk membeli GPU AMD menjadi lebih bersimpati
Karena komoditisasi berlawanan langsung dengan margin laba yang tebal
Dengan menguasai sekitar 80% pasar GPU, jika ingin meningkatkan margin laba lebih jauh, akan lebih mudah dengan menaikkan harga lebih agresif atau mengendalikan lapisan yang lebih tinggi dari seluruh stack
Misalnya, menguntungkan jika bahasa GPU serbaguna utama dibuat berpusat pada arsitektur GPU miliknya
Atau mereka harus berekspansi ke bidang yang sama sekali berbeda, dan Nvidia terjun kuat ke AI juga karena mereka bisa memanfaatkan dominasi GPU untuk memperoleh keunggulan awal di bidang itu
Namun tidak ada dasar untuk itu
Yang disebut “ilegal” itu, sampai terbukti di pengadilan, pada dasarnya hanya teori
Yang dibicarakan di sini pada intinya adalah DRM di dalam kode kernel, untuk mencegah modul kernel yang dapat dimuat menebak di mana struktur data kernel berada di memori
Karena tahu orang-orang kemungkinan akan mendorong batasannya, mereka berusaha membuatnya sesulit mungkin sebagai langkah pencegah
Namun bisa juga diklaim bahwa semua modul kernel tertutup yang dapat dimuat sama-sama melanggar GPL, dengan atau tanpa “shim”, dan klaim seperti itu memang pernah ada, tetapi kebanyakan orang melupakannya lalu memakai fiksi DRM ini seolah-olah sebagai pengganti fiksi hukum
Atau, jika fungsi bertag GPL di dalam kernel termasuk API dalam pengertian yang dibahas dalam kasus Google v. Oracle, seluruh perdebatan ini mungkin tidak terlalu berarti
Sebagian besar modul kernel yang dapat dimuat ada di pohon sumber kernel dan disediakan dengan GPL
Langkah berikutnya adalah membuat modul sumber terbuka yang dapat dimuat, yang menyertakan mesin virtual kecil untuk memuat gumpalan biner di mode pengguna
Misalnya hanya menjalankan gumpalan biner yang ditandatangani dengan kunci privat milik NVIDIA, sementara kunci publiknya disertakan dalam modul sumber terbuka
Atau membuat hypervisor yang memvirtualisasikan Linux untuk melewati sebagian besar kernel…
Selalu ada cara
Ini hanya membuatnya menjengkelkan dan menaikkan biaya untuk mendapatkan driver yang layak bagi Linux, sehingga upaya yang dicurahkan ke arah itu akan berkurang
Belum jelas apakah itu kerugian besar
Saya berharap pertarungan ini pada akhirnya tidak membuat driver Nvidia untuk Linux hilang atau menjadi lebih buruk
Tanpa driver itu, sistem operasi favorit saya tiba-tiba menjadi kurang berguna karena game dan AI
Sepuluh tahun lalu berbeda
Saat itu yang terutama peduli adalah segelintir penggila Linux yang ingin bermain game di Linux, dan mereka hanya bagian kecil dari pendapatan
Sekarang, pada dasarnya seluruh nilai perusahaan NVIDIA dibangun di atas AI, dan hampir semua pemain utama yang membeli perangkat keras itu dalam jumlah besar menggunakannya di Linux
Memutus hubungan dengan Linux bukanlah opsi bagi NVIDIA
Mereka kemungkinan besar akan melakukan apa pun agar hal itu tidak terjadi
Hapus semua dukungan sampai nVidia membuka kodenya
Namun sekarang, bukan kita, melainkan perusahaan komersial yang punya suara lebih besar soal bagaimana perangkat keras dipakai dan didukung di Linux
Nvidia telah membuka driver, atau sebagian darinya, sebagai sumber terbuka dan kini juga menyediakan biner firmware yang dapat didistribusikan ulang
Selain itu, autentikasi firmware juga sudah ditembus pada sebagian kartu lama
Jadi saya berharap seiring waktu pentingnya driver proprietary akan berkurang
Di tingkat kernel, ini jadi semacam “apa warna bit-mu”[1]… bagus?
[1] https://ansuz.sooke.bc.ca/entry/23