GoGPT Best VPN GoSearch

favorit OnWorks

perlsec - Online di Cloud

Jalankan perlsec di penyedia hosting gratis OnWorks melalui Ubuntu Online, Fedora Online, emulator online Windows, atau emulator online MAC OS

Ini adalah perintah perlsec yang dapat dijalankan di penyedia hosting gratis OnWorks menggunakan salah satu dari beberapa workstation online gratis kami seperti Ubuntu Online, Fedora Online, emulator online Windows atau emulator online MAC OS

PROGRAM:

NAMA


perlsec - Keamanan Perl

DESKRIPSI


Perl dirancang untuk memudahkan pemrograman dengan aman bahkan saat dijalankan dengan ekstra
hak istimewa, seperti program setuid atau setgid. Tidak seperti kebanyakan shell baris perintah, yang
berdasarkan beberapa operan substitusi pada setiap baris skrip, Perl menggunakan lebih banyak
skema evaluasi konvensional dengan lebih sedikit hambatan tersembunyi. Selain itu, karena
bahasa memiliki lebih banyak fungsi bawaan, ia dapat kurang mengandalkan eksternal (dan mungkin
tidak dapat dipercaya) program untuk mencapai tujuannya.

KEAMANAN KERENTANAN HUBUNGI KAMI(CONTACT) INFORMASI


Jika Anda yakin telah menemukan kerentanan keamanan di Perl, silakan kirim email
[email dilindungi] dengan rincian. Ini menunjuk ke langganan tertutup,
milis yang tidak diarsipkan. Harap gunakan alamat ini hanya untuk masalah keamanan di Perl
inti, bukan untuk modul yang didistribusikan secara independen di CPAN.

KEAMANAN MEKANISME DAN MASALAH


Noda mode
Perl secara otomatis mengaktifkan serangkaian pemeriksaan keamanan khusus, yang disebut noda mode, kapan itu
mendeteksi programnya berjalan dengan ID pengguna atau grup yang nyata dan efektif yang berbeda. Itu
bit setuid dalam izin Unix adalah mode 04000, mode bit setgid 02000; salah satu atau keduanya
dapat diatur. Anda juga dapat mengaktifkan mode noda secara eksplisit dengan menggunakan -T bendera baris perintah.
Bendera ini adalah sangat disarankan untuk program server dan program apa pun yang dijalankan atas nama
orang lain, seperti skrip CGI. Setelah mode noda aktif, itu akan menyala selama sisa waktu
naskah Anda.

Saat dalam mode ini, Perl mengambil tindakan pencegahan khusus yang disebut noda pemeriksaan untuk mencegah keduanya
perangkap yang jelas dan halus. Beberapa pemeriksaan ini cukup sederhana, seperti memverifikasi
direktori jalur itu tidak dapat ditulis oleh orang lain; programmer yang berhati-hati selalu menggunakan
cek seperti ini. Pemeriksaan lain, bagaimanapun, paling baik didukung oleh bahasa itu sendiri, dan
pemeriksaan ini terutama yang berkontribusi untuk membuat program Perl set-id lebih aman
dari program C yang sesuai.

Anda tidak boleh menggunakan data yang berasal dari luar program Anda untuk memengaruhi hal lain di luar
program Anda--setidaknya, bukan karena kebetulan. Semua argumen baris perintah, lingkungan
variabel, informasi lokal (lihat perlllocale), hasil panggilan sistem tertentu
("readdir()", "readlink()", variabel "shmread()", pesan yang dikembalikan oleh
"msgrcv()", kata sandi, gcos, dan bidang shell yang dikembalikan oleh panggilan "getpwxxx()", dan
semua input file ditandai sebagai "tercemar". Data tercemar tidak boleh digunakan secara langsung atau
secara tidak langsung dalam perintah apa pun yang memanggil sub-kulit, atau dalam perintah apa pun yang memodifikasi
file, direktori, atau proses, dengan itu berikut pengecualian:

· Argumen untuk "print" dan "syswrite" adalah tidak diperiksa untuk kekotoran.

· Metode simbolik

$obj->$metode(@args);

dan sub referensi simbolis

&{$foo}(@args);
$foo->(@args);

tidak diperiksa untuk kekotoran. Ini membutuhkan kehati-hatian ekstra kecuali jika Anda mau
data eksternal untuk memengaruhi aliran kontrol Anda. Kecuali Anda dengan hati-hati membatasi apa ini
nilai simbolik adalah, orang dapat memanggil fungsi di luar kode Perl Anda, seperti
POSIX::system, dalam hal ini mereka dapat menjalankan kode eksternal arbitrer.

· Kunci hash adalah tak pernah tercemar.

Untuk alasan efisiensi, Perl mengambil pandangan konservatif apakah data tercemar. Jika
ekspresi berisi data tercemar, subekspresi apa pun dapat dianggap tercemar, bahkan jika
nilai subekspresi itu sendiri tidak terpengaruh oleh data yang tercemar.

Karena taintedness diasosiasikan dengan setiap nilai skalar, beberapa elemen array atau
hash dapat dinodai dan yang lainnya tidak. Kunci dari hash adalah tak pernah tercemar.

Sebagai contoh:

$arg = pergeseran; # $arg tercemar
$hid = $arg . 'batang'; # $hid juga tercemar
$baris = <>; # Tercemar
$baris = ; # Juga tercemar
buka FOO, "/home/me/bar" atau die $!;
$baris = ; # Masih ternoda
$jalur = $ENV{'PATH'}; # Tercemar, tapi lihat di bawah
$data = 'abc'; # Tidak ternoda

sistem "echo $arg"; # Merasa tidak aman
sistem "/ bin / gema", $arg; # Dianggap tidak aman
# (Perl tidak tahu tentang / bin / gema)
sistem "echo $hid"; # Merasa tidak aman
sistem "gema $data"; # Tidak aman hingga PATH ditetapkan

$jalur = $ENV{'PATH'}; # $path sekarang tercemar

$ENV{'PATH'} = '/tempat sampah:/ usr / bin';
hapus @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};

$jalur = $ENV{'PATH'}; # $path sekarang TIDAK ternoda
sistem "gema $data"; # Aman sekarang!

buka(FOO, "< $arg"); # OK - file hanya-baca
buka(FOO, "> $arg"); # Tidak OK - mencoba menulis

buka(FOO,"echo $arg|"); # Tidak baik
buka(FOO,"-|")
atau exec 'echo', $arg; # Juga tidak oke

$teriak = `echo $arg`; # Tidak aman, $teriak sekarang tercemar

batalkan tautan $data, $arg; # Merasa tidak aman
umask $arg; # Merasa tidak aman

exec "echo $arg"; # Merasa tidak aman
exec "echo", $arg; # Merasa tidak aman
exec "sh", '-c', $arg; # Sangat tidak aman!

@file = <*.c>; # tidak aman (menggunakan readdir() atau serupa)
@file = glob('*.c'); # tidak aman (menggunakan readdir() atau serupa)

# Dalam kedua kasus, hasil glob tercemar, karena daftar
# nama file berasal dari luar program.

$buruk = ($arg, 23); # $bad akan tercemar
$arg, `benar`; # Tidak aman (walaupun sebenarnya tidak)

Jika Anda mencoba melakukan sesuatu yang tidak aman, Anda akan mendapatkan kesalahan fatal dengan mengatakan sesuatu seperti
"Ketergantungan tidak aman" atau "Tidak aman $ENV{PATH}".

Pengecualian untuk prinsip "satu nilai yang tercemar mencemari seluruh ekspresi" adalah dengan
operator kondisional ternary "?:". Sejak kode dengan ternary conditional

$hasil = $tainted_value ? "Tidak ternoda" : "Juga tidak ternoda";

secara efektif

jika ( $tainted_value ) {
$hasil = "Tidak Tercela";
} Else {
$result = "Juga tidak ternoda";
}

tidak masuk akal jika $result dinodai.

Pencucian dan Mendeteksi Tercemar Data
Untuk menguji apakah suatu variabel berisi data tercemar, dan yang penggunaannya akan memicu
Pesan "Ketergantungan tidak aman", Anda dapat menggunakan fungsi "tercemar ()" dari Scalar::Util
modul, tersedia di cermin CPAN terdekat Anda, dan termasuk dalam Perl mulai dari
rilis 5.8.0. Atau Anda mungkin dapat menggunakan fungsi "is_tainted()" berikut.

sub tercemar {
lokal $@; # Jangan mencemari nilai pemanggil.
kembali ! eval { eval("#" . substr(bergabung("", @_), 0, 0)); 1 };
}

Fungsi ini memanfaatkan fakta bahwa keberadaan data tercemar di mana saja dalam suatu
ekspresi membuat seluruh ekspresi ternoda. Itu akan menjadi tidak efisien untuk setiap
operator untuk menguji setiap argumen untuk taintedness. Sebaliknya, sedikit lebih efisien dan
pendekatan konservatif digunakan bahwa jika ada nilai tercemar telah diakses dalam yang sama
ekspresi, seluruh ekspresi dianggap tercemar.

Tetapi pengujian untuk noda membuat Anda hanya sejauh ini. Terkadang Anda hanya perlu mengosongkan
kekotoran data. Nilai mungkin tidak ternoda dengan menggunakannya sebagai kunci dalam hash; jika tidak
satu-satunya cara untuk melewati mekanisme tainting adalah dengan merujuk subpola dari regular
kecocokan ekspresi. Perl menganggap bahwa jika Anda mereferensikan substring menggunakan $1, $2, dll. dalam a
pola non-noda, bahwa Anda tahu apa yang Anda lakukan ketika Anda menulis pola itu. Itu
berarti menggunakan sedikit pemikiran--jangan hanya membabi buta mengotori apa pun, atau Anda mengalahkan
seluruh mekanisme. Lebih baik untuk memverifikasi bahwa variabel hanya memiliki karakter yang baik (untuk
nilai-nilai tertentu "baik") daripada memeriksa apakah ia memiliki karakter buruk. itu
karena terlalu mudah untuk melewatkan karakter buruk yang tidak pernah Anda pikirkan.

Berikut tes untuk memastikan bahwa data tidak berisi apa pun selain karakter "kata"
(abjad, angka, dan garis bawah), tanda hubung, tanda di, atau titik.

if ($data =~ /^([-\@\w.]+)$/) {
$data = $1; # $data sekarang tidak ternoda
} Else {
die "Data buruk di '$data'"; # catat ini di suatu tempat
}

Ini cukup aman karena "/\w+/" biasanya tidak cocok dengan karakter meta shell, juga tidak
titik, tanda hubung, atau di akan berarti sesuatu yang khusus untuk shell. Penggunaan "/.+/" akan memiliki
secara teori tidak aman karena membiarkan semuanya lewat, tetapi Perl tidak memeriksa
itu. Pelajarannya adalah ketika menodai, Anda harus sangat berhati-hati dengan
pola. Pencucian data menggunakan ekspresi reguler adalah hanya mekanisme untuk pewarnaan
data kotor, kecuali jika Anda menggunakan strategi yang dirinci di bawah ini untuk memotong anak yang lebih rendah
hak istimewa.

Contoh tidak menghapus $data jika "gunakan lokal" berlaku, karena karakter
dicocokkan dengan "\w" ditentukan oleh lokal. Perl menganggap bahwa definisi lokal adalah
tidak dapat dipercaya karena mengandung data dari luar program. Jika Anda menulis
program sadar lokal, dan ingin mencuci data dengan ekspresi reguler yang berisi "\w",
letakkan "tidak ada lokal" di depan ekspresi di blok yang sama. Lihat "SECURITY" di perlllocale
untuk pembahasan lebih lanjut dan contoh.

Switch On itu "#!" baris
Saat Anda membuat skrip dapat dieksekusi, untuk membuatnya dapat digunakan sebagai perintah, sistem
akan meneruskan sakelar ke Perl dari skrip #! garis. Perl memeriksa apakah ada baris perintah
sakelar yang diberikan ke skrip setuid (atau setgid) benar-benar cocok dengan yang disetel pada #! garis.
Beberapa lingkungan mirip Unix dan Unix memberlakukan batas satu sakelar pada #! garis, jadi kamu boleh
perlu menggunakan sesuatu seperti "-wU" alih-alih "-w -U" di bawah sistem seperti itu. (Masalah ini
harus muncul hanya di lingkungan Unix atau mirip Unix yang mendukung #! dan setuid atau setgid
skrip.)

Noda mode dan @INC
Saat mode noda ("-T") aktif, tombol "." direktori dihapus dari @INC, dan
variabel lingkungan "PERL5LIB" dan "PERLLIB" diabaikan oleh Perl. Anda masih bisa menyesuaikan
@INC dari luar program dengan menggunakan opsi baris perintah "-I" seperti yang dijelaskan dalam
perlrun. Dua variabel lingkungan diabaikan karena mereka dikaburkan, dan pengguna
menjalankan program mungkin tidak menyadari bahwa mereka disetel, sedangkan opsi "-I" jelas
terlihat dan oleh karena itu diizinkan.

Cara lain untuk memodifikasi @INC tanpa memodifikasi program, adalah dengan menggunakan pragma "lib",
misalnya:

perl -Mlib=/program foo

Manfaat menggunakan "-Mlib=/foo" daripada "-I/foo", adalah bahwa yang pertama akan secara otomatis
menghapus direktori yang digandakan, sedangkan yang terakhir tidak.

Perhatikan bahwa jika string tercemar ditambahkan ke @INC, masalah berikut akan dilaporkan:

Ketergantungan tidak aman dalam kebutuhan saat menjalankan dengan -T switch

Pembersihan Up Anda xtra
Untuk pesan "$ENV{PATH}" tidak aman, Anda perlu menyetel $ENV{'PATH'} ke nilai yang diketahui, dan
setiap direktori di jalur harus absolut dan tidak dapat ditulis oleh orang lain selain pemiliknya dan
kelompok. Anda mungkin terkejut mendapatkan pesan ini bahkan jika pathname ke executable Anda
sepenuhnya memenuhi syarat. Ini tidak dihasilkan karena Anda tidak menyediakan jalur lengkap ke
program; sebagai gantinya, itu dihasilkan karena Anda tidak pernah mengatur variabel lingkungan PATH Anda, atau
Anda tidak mengaturnya ke sesuatu yang aman. Karena Perl tidak dapat menjamin bahwa
yang dapat dieksekusi yang dimaksud tidak dengan sendirinya akan berbalik dan menjalankan beberapa program lain
yang tergantung pada PATH Anda, itu memastikan Anda mengatur PATH.

PATH bukan satu-satunya variabel lingkungan yang dapat menyebabkan masalah. Karena beberapa
shell dapat menggunakan variabel IFS, CDPATH, ENV, dan BASH_ENV, Perl memeriksa apakah itu
kosong atau tidak ternoda saat memulai subproses. Anda mungkin ingin menambahkan sesuatu seperti
ini ke skrip setid dan pemeriksaan noda Anda.

hapus @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # Jadikan %ENV lebih aman

Mungkin juga mendapat masalah dengan operasi lain yang tidak peduli apakah mereka
menggunakan nilai-nilai yang tercemar. Gunakan uji file dengan bijaksana dalam menangani setiap pengguna-
nama file yang disediakan. Jika memungkinkan, lakukan pembukaan dan semacamnya setelah dengan benar menjatuhkan spesial apa pun
hak istimewa pengguna (atau grup!). Perl tidak mencegah Anda membuka nama file yang tercemar untuk
membaca, jadi berhati-hatilah dengan apa yang Anda cetak. Mekanisme pencemaran dimaksudkan untuk mencegah
kesalahan bodoh, bukan untuk menghilangkan kebutuhan untuk berpikir.

Perl tidak memanggil Shell untuk memperluas kartu liar ketika Anda melewati "sistem" dan "exec"
daftar parameter eksplisit alih-alih string dengan kemungkinan wildcard Shell di dalamnya.
Sayangnya, fungsi "terbuka", "glob", dan backtick tidak memberikan alternatif seperti itu
konvensi pemanggilan, jadi diperlukan lebih banyak dalih.

Perl menyediakan cara yang cukup aman untuk membuka file atau pipa dari setuid atau setgid
program: buat saja proses anak dengan hak istimewa yang dikurangi untuk siapa melakukan pekerjaan kotor
Anda. Pertama, garpu anak menggunakan sintaks "terbuka" khusus yang menghubungkan induk dan
anak dengan pipa. Sekarang anak mengatur ulang set ID-nya dan atribut per-proses lainnya,
seperti variabel lingkungan, umask, direktori kerja saat ini, kembali ke aslinya atau
nilai aman yang diketahui. Kemudian proses anak, yang tidak lagi memiliki izin khusus,
melakukan panggilan sistem "terbuka" atau lainnya. Akhirnya, anak melewati data yang berhasil
akses kembali ke orang tua. Karena file atau pipa dibuka di anak saat dijalankan
di bawah hak istimewa yang kurang dari orang tua, itu tidak cenderung ditipu untuk melakukan sesuatu itu
seharusnya tidak.

Berikut cara melakukan backtick dengan cukup aman. Perhatikan bagaimana "exec" tidak dipanggil dengan
string yang shell bisa memperluas. Sejauh ini, ini adalah cara terbaik untuk menyebut sesuatu yang
mungkin mengalami pelarian shell: jangan pernah memanggil shell sama sekali.

gunakan Bahasa Inggris;
die "Tidak bisa garpu: $!" kecuali jika didefinisikan($pid = open(KID, "-|"));
if ($pid) { # induk
ketika ( ) {
# lakukan sesuatu
}
tutup ANAK;
} Else {
@temp saya = ($EUID, $EGID);
$orig_uid saya = $UID;
$orig_gid saya = $GID;
$EUID = $UID;
$EGID = $GID;
# Jatuhkan hak istimewa
$UID = $asal_uid;
$GID = $asal_gid;
# Pastikan privs benar-benar hilang
($EUID, $EGID) = @temp;
die "Tidak dapat menjatuhkan hak istimewa"
kecuali $UID == $EUID && $GID eq $EGID;
$ENV{PATH} = "/tempat sampah:/ usr / bin"; # PATH Minimal.
# Pertimbangkan untuk lebih membersihkan lingkungan.
exec 'myprog', 'arg1', 'arg2'
atau die "tidak bisa exec myprog: $!";
}

Strategi serupa akan bekerja untuk ekspansi wildcard melalui "glob", meskipun Anda dapat menggunakan
"readdir" sebagai gantinya.

Pemeriksaan noda paling berguna ketika Anda percaya diri Anda tidak menulis a
program untuk memberikan pertanian, Anda tidak perlu mempercayai mereka yang akhirnya tidak menggunakannya
untuk mencoba mengelabuinya agar melakukan sesuatu yang buruk. Ini adalah jenis pemeriksaan keamanan itu
berguna untuk program set-id dan program yang diluncurkan atas nama orang lain, seperti CGI
program.

Ini sangat berbeda, bagaimanapun, dari bahkan tidak mempercayai penulis kode untuk tidak mencoba
untuk melakukan sesuatu yang jahat. Itulah jenis kepercayaan yang dibutuhkan ketika seseorang memberi Anda sebuah program
Anda belum pernah melihat sebelumnya dan berkata, "Ini, jalankan ini." Untuk keamanan seperti itu, Anda mungkin
ingin memeriksa modul Aman, termasuk standar dalam distribusi Perl. Ini
modul memungkinkan programmer untuk mengatur kompartemen khusus di mana semua operasi sistem
terjebak dan akses namespace dikontrol dengan hati-hati. Aman tidak harus dipertimbangkan
anti peluru, meskipun: itu tidak akan mencegah kode asing untuk mengatur loop tak terbatas,
mengalokasikan gigabyte memori, atau bahkan menyalahgunakan bug Perl untuk membuat juru bahasa host mogok
atau berperilaku dengan cara yang tidak terduga. Bagaimanapun, lebih baik dihindari sepenuhnya jika Anda
sangat memperhatikan keamanan.

Security Bug
Di luar masalah nyata yang berasal dari pemberian hak istimewa khusus untuk sistem sebagai
fleksibel seperti skrip, pada banyak versi Unix, skrip set-id secara inheren tidak aman
benar dari awal. Masalahnya adalah kondisi balapan di kernel. Antara waktu
kernel membuka file untuk melihat penerjemah mana yang harus dijalankan dan kapan (sekarang-set-id)
penerjemah berbalik dan membuka kembali file untuk menafsirkannya, file yang dimaksud mungkin
telah berubah, terutama jika Anda memiliki tautan simbolis di sistem Anda.

Untungnya, terkadang "fitur" kernel ini dapat dinonaktifkan. Sayangnya, ada
dua cara untuk menonaktifkannya. Sistem dapat dengan mudah melarang skrip dengan set bit set-id apa pun,
yang tidak banyak membantu. Sebagai alternatif, itu dapat dengan mudah mengabaikan bit set-id pada skrip.

Namun, jika fitur skrip set-id kernel tidak dinonaktifkan, Perl akan mengeluh keras
bahwa skrip set-id Anda tidak aman. Anda harus menonaktifkan set-id kernel
fitur skrip, atau letakkan pembungkus C di sekitar skrip. Pembungkus AC hanyalah kompilasi
program yang tidak melakukan apa pun kecuali memanggil program Perl Anda. Program yang dikompilasi tidak
tunduk pada bug kernel yang mengganggu skrip set-id. Ini pembungkus sederhana, tertulis
dalam C:

#define REAL_PATH "/path/ke/script"
utama (ac, av)
karakter **av;
{
execv(REAL_PATH, av);
}

Kompilasi pembungkus ini menjadi executable biner dan kemudian buat it daripada naskahmu
setuid atau setgid.

Dalam beberapa tahun terakhir, vendor telah mulai menyediakan sistem yang bebas dari bug keamanan yang melekat ini.
Pada sistem seperti itu, ketika kernel melewati nama skrip set-id untuk dibuka ke
penerjemah, alih-alih menggunakan subjek nama path untuk ikut campur, itu malah lewat
/dev/fd/3. Ini adalah file khusus yang sudah dibuka pada skrip, sehingga tidak ada
kondisi balapan untuk skrip jahat untuk dieksploitasi. Pada sistem ini, Perl harus dikompilasi
dengan "-DSETUID_SCRIPTS_ARE_SECURE_NOW". Itu Konfigurasi program yang membangun Perl mencoba untuk
cari tahu sendiri, jadi Anda tidak perlu menentukannya sendiri. Paling
rilis modern SysVr4 dan BSD 4.4 menggunakan pendekatan ini untuk menghindari balapan kernel
kondisi.

Melindungi Anda program
Ada beberapa cara untuk menyembunyikan sumber ke program Perl Anda, dengan berbagai level
dari "keamanan".

Namun, pertama-tama, Anda tidak bisa hapus izin baca, karena kode sumber harus
dapat dibaca untuk dikompilasi dan ditafsirkan. (Itu tidak berarti bahwa CGI
sumber skrip dapat dibaca oleh orang-orang di web.) Jadi, Anda harus meninggalkan
izin di tingkat 0755 yang ramah sosial. Ini memungkinkan orang-orang di sistem lokal Anda
hanya melihat sumber Anda.

Beberapa orang secara keliru menganggap ini sebagai masalah keamanan. Jika program Anda tidak aman
hal-hal, dan bergantung pada orang yang tidak tahu bagaimana mengeksploitasi rasa tidak aman itu, itu tidak
aman. Seringkali mungkin bagi seseorang untuk menentukan hal-hal yang tidak aman dan mengeksploitasi
mereka tanpa melihat sumbernya. Keamanan melalui ketidakjelasan, nama untuk menyembunyikan Anda
bug alih-alih memperbaikinya, memang sedikit keamanan.

Anda dapat mencoba menggunakan enkripsi melalui filter sumber (Filter::* dari CPAN, atau
Filter::Util::Call dan Filter::Sederhana sejak Perl 5.8). Tapi kerupuk mungkin bisa
mendekripsi itu. Anda dapat mencoba menggunakan kompiler kode byte dan juru bahasa yang dijelaskan di bawah ini, tetapi
cracker mungkin dapat mendekompilasinya. Anda dapat mencoba menggunakan kompiler kode asli
dijelaskan di bawah ini, tetapi cracker mungkin dapat membongkarnya. Ini berpose dengan derajat yang berbeda-beda
kesulitan bagi orang yang ingin mendapatkan kode Anda, tetapi tidak ada yang dapat menyembunyikannya secara pasti
(ini berlaku untuk setiap bahasa, bukan hanya Perl).

Jika Anda khawatir tentang orang-orang yang mengambil untung dari kode Anda, maka intinya adalah
tidak ada apa-apa selain lisensi yang membatasi yang akan memberi Anda keamanan hukum. Lisensikan perangkat lunak Anda dan
membumbuinya dengan pernyataan yang mengancam seperti "Ini adalah perangkat lunak berpemilik yang tidak dipublikasikan dari
XYZ Corp. Akses Anda ke sana tidak memberi Anda izin untuk menggunakannya bla bla bla." Anda
harus menemui pengacara untuk memastikan kata-kata lisensi Anda akan berdiri di pengadilan.

Unicode
Unicode adalah teknologi baru dan kompleks dan orang dapat dengan mudah mengabaikan keamanan tertentu
perangkap. Lihat perluniintro untuk gambaran umum dan perlunicode untuk detailnya, dan "Keamanan
Implikasi Unicode" dalam perlunicode untuk implikasi keamanan khususnya.

Algoritma Kompleksitas Serangan
Algoritma internal tertentu yang digunakan dalam implementasi Perl dapat diserang dengan memilih
input dengan hati-hati untuk mengkonsumsi sejumlah besar waktu atau ruang atau keduanya. Ini bisa
mengarah ke apa yang disebut Penyangkalan of Pelayanan (DoS) serangan.

· Algoritma Hash - Algoritma hash seperti yang digunakan di Perl terkenal sebagai
rentan terhadap serangan tabrakan pada fungsi hash mereka. Serangan semacam itu melibatkan
membangun satu set kunci yang bertabrakan ke dalam ember yang sama menghasilkan tidak efisien
perilaku. Serangan semacam itu seringkali bergantung pada penemuan benih fungsi hash yang digunakan
untuk memetakan kunci ke ember. Benih itu kemudian digunakan untuk memaksa set kunci yang bisa
digunakan untuk memasang serangan penolakan layanan. Dalam Perl 5.8.1 perubahan diperkenalkan ke
mengeraskan Perl untuk serangan seperti itu, dan kemudian di Perl 5.18.0 fitur-fitur ini adalah
ditingkatkan dan perlindungan tambahan ditambahkan.

Pada saat penulisan ini, Perl 5.18.0 dianggap telah dikeraskan dengan baik terhadap
serangan kompleksitas algoritmik pada implementasi hashnya. Ini sebagian besar berutang pada
langkah-langkah berikut mengurangi serangan:

Pengacakan Benih Hash
Untuk membuat tidak mungkin mengetahui seed apa yang menghasilkan set kunci serangan
karena, benih ini diinisialisasi secara acak pada awal proses. Ini mungkin ditimpa
dengan menggunakan variabel lingkungan PERL_HASH_SEED, lihat "PERL_HASH_SEED" di perlrun.
Variabel lingkungan ini mengontrol bagaimana item sebenarnya disimpan, bukan bagaimana mereka
disajikan melalui "kunci", "nilai" dan "masing-masing".

Pengacakan Traversal Hash
Terlepas dari benih mana yang digunakan dalam fungsi hash, "kunci", "nilai", dan
"setiap" mengembalikan item dalam urutan acak per hash. Memodifikasi hash dengan penyisipan
akan mengubah urutan iterasi hash itu. Perilaku ini dapat ditimpa oleh
menggunakan "hash_traversal_mask()" dari Hash::Util atau dengan menggunakan PERL_PERTURB_KEYS
variabel lingkungan, lihat "PERL_PERTURB_KEYS" di perlrun. Perhatikan bahwa fitur ini
mengontrol urutan kunci yang "terlihat", dan bukan urutan penyimpanannya yang sebenarnya
masuk

Gangguan Urutan Bucket
Ketika item bertabrakan ke dalam ember hash yang diberikan, urutannya disimpan dalam rantai
tidak lagi dapat diprediksi di Perl 5.18. Ini memiliki niat untuk membuatnya lebih sulit
untuk mengamati tumbukan. Perilaku ini dapat diganti dengan menggunakan
Variabel lingkungan PERL_PERTURB_KEYS, lihat "PERL_PERTURB_KEYS" di perlrun.

Fungsi Hash Default Baru
Fungsi hash default telah dimodifikasi dengan maksud untuk membuatnya lebih sulit
untuk menyimpulkan benih hash.

Fungsi Hash Alternatif
Kode sumber mencakup beberapa algoritma hash untuk dipilih. Saat kita
percaya bahwa hash perl default kuat untuk diserang, kami telah menyertakan hash
fungsi Siphash sebagai opsi mundur. Pada saat rilis Perl 5.18.0
Siphash diyakini memiliki kekuatan kriptografi. Ini bukan default sebagai
itu jauh lebih lambat daripada hash default.

Tanpa mengkompilasi Perl khusus, tidak ada cara untuk mendapatkan perilaku yang sama persis dari
semua versi sebelum Perl 5.18.0. Yang paling dekat bisa didapat adalah dengan mengatur
PERL_PERTURB_KEYS ke 0 dan menyetel PERL_HASH_SEED ke nilai yang diketahui. Kita tidak
menyarankan pengaturan tersebut untuk penggunaan produksi karena pertimbangan keamanan di atas.

Perl memiliki tak pernah terjamin Apa pun pemesanan of itu hash kunci-kunci, dan pemesanan sudah
diubah beberapa kali selama masa pakai Perl 5. Juga, urutan kunci hash
selalu, dan terus, dipengaruhi oleh urutan penyisipan dan sejarah
perubahan yang dilakukan pada hash selama masa pakainya.

Perhatikan juga bahwa meskipun urutan elemen hash mungkin diacak, "pseudo-
memesan" harus tidak digunakan untuk aplikasi seperti mengacak daftar secara acak (gunakan
"List::Util::shuffle()" untuk itu, lihat List::Util, modul inti standar sejak Perl
5.8.0; atau modul CPAN "Algoritma::Numerik::Acak"), atau untuk menghasilkan
permutasi (gunakan misalnya modul CPAN "Algoritma::Permute" atau
"Algoritma::FastPermute"), atau untuk aplikasi kriptografi apa pun.

Hash terikat mungkin memiliki urutan sendiri dan serangan kompleksitas algoritmik.

· Ekspresi reguler - Mesin ekspresi reguler Perl disebut NFA (Non-
deterministic Finite Automaton), yang antara lain berarti dapat
dengan mudah menghabiskan banyak waktu dan ruang jika ekspresi reguler mungkin
mencocokkan dalam beberapa cara. Pembuatan ekspresi reguler yang hati-hati dapat membantu tetapi cukup
seringkali tidak banyak yang bisa dilakukan (buku "Menguasai Ekspresi Reguler" adalah
bacaan wajib, lihat perlfaq2). Kehabisan ruang dimanifestasikan oleh Perl
kehabisan memori.

· Sorting - algoritma quicksort yang digunakan di Perls sebelum 5.8.0 untuk mengimplementasikan menyortir()
fungsinya sangat mudah untuk ditipu agar berperilaku tidak baik sehingga menghabiskan banyak waktu.
Mulai dari Perl 5.8.0, algoritma pengurutan yang berbeda, mergesort, digunakan secara default.
Mergesort tidak dapat melakukan kesalahan pada input apa pun.

Lihathttp://www.cs.rice.edu/~scrosby/hash/> untuk informasi lebih lanjut, dan ilmu komputer apa pun
buku teks tentang kompleksitas algoritmik.

Gunakan perlsec online menggunakan layanan onworks.net


Server & Workstation Gratis

Unduh aplikasi Windows & Linux

Perintah Linux

Ad




×
iklan
❤️Berbelanja, pesan, atau beli di sini — tanpa biaya, membantu menjaga layanan tetap gratis.