Mayuta-yuta binar mengko. Carane Linux saya kuwat

Mayuta-yuta binar mengko. Carane Linux saya kuwatTL; DR. Ing artikel iki, kita njelajah skema hardening sing bisa digunakake ing limang distribusi Linux sing populer. Kanggo saben, kita njupuk konfigurasi kernel standar, ngemot kabeh paket, lan nganalisa skema keamanan ing binari sing dipasang. Distribusi sing dianggep yaiku OpenSUSE 12.4, Debian 9, CentOS, RHEL 6.10 lan 7, uga Ubuntu 14.04, 12.04 lan 18.04 LTS.

Asil kasebut ngonfirmasi manawa skema dhasar kayata tumpukan kenari lan kode independen posisi durung diadopsi dening kabeh wong. Kahanan kasebut luwih elek kanggo kompiler nalika nglindhungi kerentanan kaya tumpukan tumpukan, sing dadi sorotan ing wulan Januari sawise diterbitake. informasi babagan kerentanan systemd. Nanging ora kabeh dadi ora duwe pengarep-arep. Jumlah binari sing signifikan ngleksanakake metode perlindungan dhasar, lan jumlahe mundhak saka versi menyang versi.

Tinjauan kasebut nuduhake manawa metode proteksi paling akeh ditindakake ing Ubuntu 18.04 ing tingkat OS lan aplikasi, diikuti dening Debian 9. Ing sisih liya, OpenSUSE 12.4, CentOS 7 lan RHEL 7 uga ngetrapake skema perlindungan dhasar, lan proteksi tabrakan tumpukan. digunakake malah luwih akeh karo paket standar sing luwih padhet.

Pambuka

Iku angel kanggo mesthekake lunak kualitas dhuwur. Sanajan akeh alat canggih kanggo analisis kode statis lan analisis runtime dinamis, uga kemajuan sing signifikan ing pangembangan kompiler lan basa pamrograman, piranti lunak modern isih nandhang kerentanan sing terus-terusan dieksploitasi dening panyerang. Kahanan kasebut luwih elek ing ekosistem sing kalebu kode warisan. Ing kasus kaya mengkono, kita ora mung ngadhepi karo masalah langgeng nemokake bisa kasalahan exploitable, nanging kita uga diwatesi dening frameworks kompatibilitas sakdurunge ketat, kang asring mbutuhake kita kanggo ngreksa winates, utawa malah Samsaya Awon, ngrugekke utawa buggy kode.

Iki ngendi cara kanggo nglindhungi utawa hardening program teka menyang muter. Kita ora bisa nyegah sawetara jinis kesalahan, nanging kita bisa nggawe urip panyerang luwih angel lan sebagian ngatasi masalah kanthi nyegah utawa nyegah. eksploitasi kasalahan iki. Perlindhungan kasebut digunakake ing kabeh sistem operasi modern, nanging cara kasebut beda banget ing kerumitan, efisiensi lan kinerja: saka kenari tumpukan lan ASLR kanggo pangayoman lengkap CFI ΠΈ ROP. Ing artikel iki, kita bakal nliti cara proteksi apa sing digunakake ing distribusi Linux sing paling populer ing konfigurasi standar, lan uga nliti sifat binari sing disebarake liwat sistem manajemen paket saben distribusi.

CVE lan keamanan

Kita kabeh wis ndeleng artikel kanthi judhul kaya "Aplikasi Paling Rentan ing Taun" utawa "Sistem Operasi Paling Rentan." Biasane dheweke nyedhiyakake statistik babagan jumlah rekaman babagan kerentanan kaya CVE (Vulnerability and Exposures Umum), dijupuk saka Database Kerentanan Nasional (NVD) saka NIST lan sumber liyane. Sabanjure, aplikasi utawa OS kasebut diurutake kanthi jumlah CVE. Sayange, nalika CVEs banget migunani kanggo nelusuri masalah lan ngandhani vendor lan pangguna, padha ngomong sethitik bab keamanan nyata saka piranti lunak.

Contone, nimbang jumlah total CVE sajrone patang taun kepungkur kanggo kernel Linux lan limang distribusi server sing paling populer, yaiku Ubuntu, Debian, Red Hat Enterprise Linux lan OpenSUSE.

Mayuta-yuta binar mengko. Carane Linux saya kuwat
Gambar. Xnumx

Apa sing diarani grafik iki? Apa jumlah CVE sing luwih dhuwur tegese siji distribusi luwih rentan tinimbang liyane? Ora ana wangsulan. Contone, ing artikel iki sampeyan bakal weruh yen Debian duwe mekanisme keamanan sing luwih kuat dibandhingake karo, umpamane, OpenSUSE utawa RedHat Linux, nanging Debian duwe CVE luwih akeh. Nanging, ora ateges keamanan sing saya ringkih: sanajan ana CVE ora nuduhake manawa ana kerentanan. dieksploitasi. Skor keruwetan menehi indikasi babagan carane mbok menawa eksploitasi kerentanan, nanging pungkasane eksploitasi gumantung banget marang proteksi sing ana ing sistem sing kena pengaruh lan sumber daya lan kemampuan para panyerang. Kajaba iku, ora ana laporan CVE ora ujar babagan wong liya ora kadhaptar utawa ora dingerteni vulnerabilities. Bentenipun ing CVE bisa uga amarga faktor saliyane kualitas piranti lunak, kalebu sumber daya sing diparengake kanggo testing utawa ukuran basis pangguna. Ing conto kita, jumlah CVE Debian sing luwih dhuwur bisa uga nuduhake yen Debian ngirim paket piranti lunak luwih akeh.

Mesthi, sistem CVE nyedhiyakake informasi migunani sing ngidini sampeyan nggawe proteksi sing cocog. Luwih ngerti sebabe gagal program, luwih gampang kanggo ngenali cara eksploitasi lan ngembangake mekanisme sing cocog. deteksi lan respon. Ing Fig. 2 nuduhake kategori kerentanan kanggo kabeh distribusi sajrone patang taun kepungkur (sumber). Cetha manawa umume CVE kalebu ing kategori ing ngisor iki: penolakan layanan (DoS), eksekusi kode, kebanjiran, korupsi memori, bocor informasi (eksfiltrasi) lan eskalasi hak istimewa. Sanajan akeh CVE sing diitung kaping pirang-pirang ing macem-macem kategori, umume masalah sing padha tetep saben taun. Ing bagean sabanjure artikel, kita bakal ngevaluasi panggunaan macem-macem skema perlindungan kanggo nyegah eksploitasi kerentanan kasebut.

Mayuta-yuta binar mengko. Carane Linux saya kuwat
Gambar. Xnumx

tugas

Ing artikel iki kita arep njawab pitakonan ing ngisor iki:

  • Apa keamanan distribusi Linux sing beda-beda? Mekanisme proteksi apa sing ana ing kernel lan aplikasi ruang pangguna?
  • Kepiye cara adopsi mekanisme keamanan diganti liwat wektu ing distribusi?
  • Apa dependensi rata-rata paket lan perpustakaan kanggo saben distribusi?
  • Proteksi apa sing ditindakake kanggo saben binar?

Pamilihan distribusi

Pranyata angel golek statistik akurat babagan instalasi distribusi, amarga ing pirang-pirang kasus, jumlah unduhan ora nuduhake jumlah instalasi sing nyata. Nanging, varian Unix nggawe mayoritas sistem server (ing server web 69,2%, dening statistik W3techs lan sumber liyane), lan bagean kasebut saya tambah akeh. Mangkono, kanggo riset kita fokus ing distribusi kasedhiya metu saka kothak ing platform Google Cloud. Utamane, kita milih OS ing ngisor iki:

Distribusi / versi
Inti
Mbangun

OpenSUSE 12.4
4.12.14-95.3-standar
#1 SMP Rebo 5 Desember 06:00:48 UTC 2018 (63a8d29)

Debian 9 (stretch)
4.9.0-8-amd64
#1 SMP Debian 4.9.130-2 (2018-10-27)

CentOS 6.10
2.6.32-754.10.1.el6.x86_64
#1 SMP Sel 15 Jan 17:07:28 UTC 2019

CentOS 7
3.10.0-957.5.1.el7.x86_64
#1 SMP Jum 1 Februari 14:54:57 UTC 2019

Red Hat Enterprise Linux Server 6.10 (Santiago)
2.6.32-754.9.1.el6.x86_64
# 1 SMP Wed 21 Nov 15:08:21 EST 2018

Red Hat Enterprise Linux Server 7.6 (Maipo)
3.10.0-957.1.3.el7.x86_64
#1 SMP Kam 15 Nov 17:36:42 UTC 2018

Ubuntu 14.04 (Trusty Tahr)
4.4.0–140-generik

#166~14.04.1-Ubuntu SMP Sab Nov 17 01:52:43 UTC 20…

Ubuntu 16.04 (Xenial Xerus)
4.15.0–1026-gcp
#27~16.04.1-Ubuntu SMP Jum 7 Desember 09:59:47 UTC 2018

Ubuntu 18.04 (Bionic Beaver)
4.15.0–1026-gcp
#27-Ubuntu SMP Kam 6 Des 18:27:01 UTC 2018

Tabel 1

Анализ

Ayo sinau konfigurasi kernel standar, uga sifat paket sing kasedhiya liwat manajer paket saben distribusi metu saka kothak. Mangkono, kita mung nimbang paket saka saben pangilon standar distribusi, ora nggatekake paket saka repositori sing ora stabil (kayata pangilon 'testing' Debian) lan paket pihak katelu (kayata paket Nvidia saka pangilon standar). Kajaba iku, kita ora nganggep kompilasi kernel khusus utawa konfigurasi hardened keamanan.

Analisis Konfigurasi Kernel

Kita ngetrapake skrip analisis adhedhasar free kconfig mriksa. Ayo ndeleng paramèter proteksi out-of-the-box saka distribusi sing dijenengi lan mbandhingake karo dhaptar saka Proyek Pertahanan Diri Inti (KSPP). Kanggo saben opsi konfigurasi, Tabel 2 njlèntrèhaké setelan sing dikarepake: kothak centhang kanggo distribusi sing tundhuk karo Rekomendasi KSSP (pirsani ing ngisor iki kanggo panjelasan istilah). kene; Ing artikel sing bakal teka, kita bakal nerangake carane akeh cara keamanan kasebut lan carane hack sistem nalika ora ana).

Mayuta-yuta binar mengko. Carane Linux saya kuwat

Mayuta-yuta binar mengko. Carane Linux saya kuwat

UmumΓ©, kernel anyar duwe setelan sing luwih ketat saka kothak. Contone, CentOS 6.10 lan RHEL 6.10 ing kernel 2.6.32 ora duwe fitur kritis sing ditindakake ing kernel anyar kayata SMAP, ijin RWX sing ketat, pengacakan alamat utawa proteksi copy2usr. Perlu dicathet yen akeh opsi konfigurasi ing tabel ora kasedhiya ing versi kernel lawas lan ora bisa ditrapake ing kasunyatan - iki isih dituduhake ing tabel minangka kekurangan proteksi sing tepat. Kajaba iku, yen opsi konfigurasi ora ana ing versi tartamtu, lan keamanan mbutuhake opsi kasebut dipateni, iki dianggep minangka konfigurasi sing cukup.

Titik liyane sing kudu ditimbang nalika nerangake asil: sawetara konfigurasi kernel sing nambah permukaan serangan uga bisa digunakake kanggo keamanan. Conto kasebut kalebu uprobes lan kprobes, modul kernel, lan BPF/eBPF. Rekomendasi kita yaiku nggunakake mekanisme ing ndhuwur kanggo nyedhiyakake proteksi sing nyata, amarga ora pati penting kanggo digunakake lan eksploitasi kasebut nganggep manawa aktor jahat wis nggawe pijakan ing sistem kasebut. Nanging yen opsi kasebut diaktifake, administrator sistem kudu aktif ngawasi penyalahgunaan.

Nggoleki luwih ing entri ing Tabel 2, kita weruh manawa kernel modern nyedhiyakake sawetara opsi kanggo nglindhungi saka eksploitasi kerentanan kayata kebocoran informasi lan tumpukan / tumpukan overflows. Nanging, kita sok dong mirsani manawa distribusi populer sing paling anyar durung ngetrapake proteksi sing luwih rumit (contone, kanthi patch grsecurity) utawa proteksi modern marang serangan kode maneh (contone. kombinasi randomization karo rencana kaya R ^ X kanggo kode). Sing luwih elek, malah pertahanan sing luwih maju iki ora nglindhungi saka macem-macem serangan. Mula, penting banget kanggo pangurus sistem kanggo nglengkapi konfigurasi cerdas kanthi solusi sing nawakake deteksi lan pencegahan eksploitasi runtime.

Analisis Aplikasi

Ora nggumunake, distribusi sing beda duwe karakteristik paket sing beda, opsi kompilasi, dependensi perpustakaan, lan liya-liyane. gegandhengan distribusi lan paket kanthi sawetara dependensi (contone, coreutils ing Ubuntu utawa Debian). Kanggo ngevaluasi bedane, kita ngundhuh kabeh paket sing kasedhiya, ngekstrak isine, lan nganalisa binari lan dependensi. Kanggo saben paket, kita nglacak paket liyane sing gumantung, lan kanggo saben binar, kita nglacak dependensi kasebut. Ing bagean iki kita ringkesan ringkesan kesimpulan.

Distribusi

Total, kita ndownload 361 paket kanggo kabeh distribusi, mung njupuk paket saka pangilon standar. Kita ora nggatekake paket tanpa eksekusi ELF, kayata sumber, font, lsp. Sawise nyaring, 556 paket tetep, ngemot total 129 binari. Distribusi paket lan file ing distribusi ditampilake ing Fig. 569.

Mayuta-yuta binar mengko. Carane Linux saya kuwat
Gambar. Xnumx

Sampeyan bisa uga sok dong mirsani manawa distribusi sing luwih modern, luwih akeh paket lan binari sing ana, sing logis. Nanging, paket Ubuntu lan Debian kalebu luwih akeh binari (loro eksekusi lan modul dinamis lan perpustakaan) tinimbang CentOS, SUSE lan RHEL, sing duweni potensi mengaruhi permukaan serangan Ubuntu lan Debian (perlu dicathet yen angka kasebut nggambarake kabeh binari kabeh versi. paket, yaiku, sawetara file dianalisis kaping pirang-pirang). Iki penting banget yen sampeyan nimbang dependensi ing antarane paket. Mangkono, kerentanan ing binar paket siji bisa mengaruhi akeh bagean ekosistem, kayadene perpustakaan sing rawan bisa mengaruhi kabeh binari sing ngimpor. Minangka titik wiwitan, ayo goleki distribusi jumlah dependensi ing antarane paket ing sistem operasi sing beda:

Mayuta-yuta binar mengko. Carane Linux saya kuwat
Gambar. Xnumx

Ing meh kabeh distribusi, 60% paket duwe paling ora 10 dependensi. Kajaba iku, sawetara paket duwe jumlah dependensi sing luwih gedhe (luwih saka 100). Sing padha ditrapake kanggo mbalikke dependensi paket: kaya sing dikarepake, sawetara paket digunakake dening akeh paket liyane ing distribusi, saengga kerentanan ing sawetara sing dipilih minangka risiko dhuwur. Contone, tabel ing ngisor iki nyathet 20 paket kanthi jumlah maksimum dependensi terbalik ing SLES, Centos 7, Debian 9 lan Ubuntu 18.04 (saben sel nuduhake paket lan jumlah dependensi mbalikke).

Mayuta-yuta binar mengko. Carane Linux saya kuwat
Tabel 3

Kasunyatan sing menarik. Sanajan kabeh OS sing dianalisis dibangun kanggo arsitektur x86_64, lan umume paket duwe arsitektur sing ditetepake minangka x86_64 lan x86, paket asring ngemot binari kanggo arsitektur liyane, kaya sing ditampilake ing Gambar 5. XNUMX.

Mayuta-yuta binar mengko. Carane Linux saya kuwat
Gambar. Xnumx

Ing bagean sabanjure, kita bakal nliti karakteristik binari sing dianalisis.

Statistik pangayoman file binar

Minimal mutlak, sampeyan kudu njelajah pilihan keamanan dhasar kanggo binari sing wis ana. Sawetara distribusi Linux dilengkapi skrip sing nindakake pemeriksaan kasebut. Contone, Debian/Ubuntu duwe skrip kasebut. Punika conto karyanipun:

$ hardening-check $(which docker)
/usr/bin/docker:
 Position Independent Executable: yes
 Stack protected: yes
 Fortify Source functions: no, only unprotected functions found!
 Read-only relocations: yes
 Immediate binding: yes

Skrip mriksa lima fungsi pangayoman:

  • Position Independent Executable (PIE): Nuduhake manawa bagean teks program bisa dipindhah ing memori kanggo entuk randomization yen ASLR diaktifake ing kernel.
  • Stack Protected: Apa kenari tumpukan diaktifake kanggo nglindhungi serangan tabrakan tumpukan.
  • Fortify Source: apa fungsi sing ora aman (contone, strcpy) diganti karo mitra sing luwih aman, lan telpon sing dicenthang nalika runtime diganti karo sing ora dicenthang (contone, memcpy tinimbang __memcpy_chk).
  • Relokasi mung diwaca (RELRO): Apa entri tabel relokasi ditandhani mung diwaca yen dipicu sadurunge eksekusi diwiwiti.
  • Ikatan langsung: Apa linker runtime ngidini kabeh gerakan sadurunge eksekusi program diwiwiti (iki padha karo RELRO lengkap).

Apa mekanisme ing ndhuwur cukup? Sayange ora. Ana cara sing dikenal kanggo ngliwati kabeh pertahanan ing ndhuwur, nanging luwih angel pertahanan, luwih dhuwur bar kanggo penyerang. Tuladhane, metode bypass RELRO luwih angel ditrapake yen PIE lan ikatan langsung ditrapake. Kajaba iku, ASLR lengkap mbutuhake karya tambahan kanggo nggawe eksploitasi kerja. Nanging, panyerang canggih wis siyap kanggo ngrampungake proteksi kasebut: ora ana sing sejatine bakal nyepetake hack. Mulane penting yen langkah-langkah kasebut dianggep perlu minimal.

Kita pengin sinau carane akeh file binar ing distribusi sing dilindhungi dening iki lan telung cara liyane:

  • Bit sing ora bisa ditindakake (NX) nyegah eksekusi ing wilayah apa wae sing ora bisa dieksekusi, kayata tumpukan tumpukan, lsp.
  • RPATH / RUNPATH nuduhake path eksekusi sing digunakake dening loader dinamis kanggo nemokake perpustakaan sing cocog. Sing pertama yaiku diwajibake kanggo sistem modern apa wae: ora ana ngidini panyerang nulis muatan kasebut kanthi sewenang-wenang menyang memori lan nglakokake apa wae. Kanggo nomer loro, konfigurasi path eksekusi sing salah mbantu ngenalake kode sing ora bisa dipercaya sing bisa nyebabake sawetara masalah (contone. eskalasi hak istimewaLan masalah liyane).
  • Proteksi tabrakan tumpukan menehi pangayoman marang serangan sing nyebabake tumpukan tumpang tindih karo area memori liyane (kayata tumpukan). Given eksploitasi anyar penyalahgunaan kerentanan tabrakan tumpukan systemd, kita felt iku cocok kanggo nyakup mekanisme iki ing dataset kita.

Dadi, tanpa ado maneh, ayo mudhun menyang nomer. Tabel 4 lan 5 ngemot ringkesan analisis file eksekusi lan perpustakaan saka macem-macem distribusi.

  • Kaya sing sampeyan ngerteni, proteksi NX ditindakake ing endi wae, kanthi pangecualian sing langka. KhususΓ©, siji bisa nyathet panggunaan sing rada murah ing distribusi Ubuntu lan Debian dibandhingake karo CentOS, RHEL lan OpenSUSE.
  • Canaries tumpukan ilang ing akeh panggonan, utamanΓ© ing distribusi karo kernels lawas. Sawetara kemajuan katon ing distribusi paling anyar saka Centos, RHEL, Debian lan Ubuntu.
  • Kajaba Debian lan Ubuntu 18.04, umume distribusi duwe dhukungan PIE sing kurang.
  • Proteksi tabrakan tumpukan lemah ing OpenSUSE, Centos 7 lan RHEL 7, lan meh ora ana ing liyane.
  • Kabeh distribusi nganggo kernel modern duwe dhukungan kanggo RELRO, kanthi Ubuntu 18.04 mimpin lan Debian dadi nomer loro.

Kaya sing wis kasebut, metrik ing tabel iki minangka rata-rata kanggo kabeh versi file binar. Yen sampeyan mung ndeleng versi paling anyar saka file, nomer bakal beda (contone, ndeleng Kemajuan Debian kanthi implementasi PIE). Kajaba iku, umume distribusi biasane mung nyoba keamanan sawetara fungsi ing binar nalika ngitung statistik, nanging analisa kita nuduhake persentase nyata saka fungsi sing hardened. Mulane, yen 5 saka 50 fungsi dilindhungi ing binar, kita bakal menehi skor 0,1, sing cocog karo 10% saka fungsi sing dikuatake.

Mayuta-yuta binar mengko. Carane Linux saya kuwat
Tabel 4. Karakteristik keamanan kanggo file eksekusi ditampilake ing Fig. 3 (implementasine fungsi sing relevan minangka persentase saka total file sing bisa dieksekusi)

Mayuta-yuta binar mengko. Carane Linux saya kuwat
Tabel 5. Karakteristik keamanan kanggo perpustakaan ditampilake ing Fig. 3 (implementasine fungsi sing relevan minangka persentase saka total perpustakaan)

Dadi ana kemajuan? Mesthi ana: iki bisa dideleng saka statistik distribusi individu (contone, Debian), uga saka tabel ing ndhuwur. Minangka conto ing Fig. Gambar 6 nuduhake implementasine mekanisme proteksi ing telung distribusi berturut-turut Ubuntu LTS 5 (kita wis ngilangi statistik proteksi tabrakan tumpukan). We sok dong mirsani sing saka versi kanggo versi liyane lan liyane file ndhukung canaries tumpukan, lan uga liyane lan liyane binari dikirim karo pangayoman RELRO lengkap.

Mayuta-yuta binar mengko. Carane Linux saya kuwat
Gambar. Xnumx

Sayange, sawetara file eksekusi ing macem-macem distribusi isih ora duwe proteksi ing ndhuwur. Contone, ndeleng Ubuntu 18.04, sampeyan bakal weruh binar ngetty (panggantos getty), uga cangkang mksh lan lksh, juru picolisp, paket nvidia-cuda-toolkit (paket populer kanggo aplikasi sing dicepetake GPU. kayata kerangka pembelajaran mesin), lan klibc -utils. Mangkono uga, binar mandos-klien (alat administratif sing ngidini sampeyan bisa urip maneh mesin kanthi sistem file sing dienkripsi) uga rsh-redone-klien (reimplementasi rsh lan rlogin) dikirim tanpa proteksi NX, sanajan duwe hak SUID : (. Uga, Saperangan binar suid kurang pangayoman dhasar kayata canaries tumpukan (contone, binar Xorg.wrap saka paket Xorg).

Ringkesan lan Panutup

Ing artikel iki, kita wis nyorot sawetara fitur keamanan distribusi Linux modern. Analisis kasebut nuduhake manawa distribusi Ubuntu LTS (18.04) paling anyar, rata-rata, proteksi tingkat OS lan aplikasi sing paling kuat ing antarane distribusi kanthi kernel sing relatif anyar, kayata Ubuntu 14.04, 12.04 lan Debian 9. Nanging, distribusi sing ditliti CentOS, RHEL lan OpenSUSE ing set kita minangka standar, dheweke ngasilake paket sing luwih padhet, lan ing versi paling anyar (CentOS lan RHEL) duwe persentase proteksi tabrakan tumpukan sing luwih dhuwur tinimbang pesaing adhedhasar Debian (Debian lan Ubuntu). Mbandingaken versi CentOS lan RedHat, kita sok dong mirsani dandan gedhe ing implementasine saka canaries tumpukan lan RELRO saka versi 6 kanggo 7, nanging ing rata-rata CentOS wis luwih fitur dileksanakake saka RHEL. UmumΓ©, kabeh distribusi kudu menehi perhatian khusus marang proteksi PIE, sing, kajaba Debian 9 lan Ubuntu 18.04, dileksanakake kurang saka 10% binari ing dataset kita.

Pungkasan, kudu dicathet yen sanajan kita nindakake riset kanthi manual, ana akeh alat keamanan sing kasedhiya (contone. Lynis, macan, Hubble), sing nindakake analisis lan mbantu ngindhari konfigurasi sing ora aman. Sayange, malah pangayoman kuwat ing konfigurasi cukup ora njamin ananΓ© eksploitasi. Pramila kita yakin manawa penting kanggo mesthekake ngawasi dipercaya lan Nyegah saka serangan ing wektu nyata, fokus ing pola eksploitasi lan nyegah.

Source: www.habr.com

Add a comment