Ini ialah perintah perlsec yang boleh dijalankan dalam penyedia pengehosan percuma OnWorks menggunakan salah satu daripada berbilang stesen kerja dalam talian percuma kami seperti Ubuntu Online, Fedora Online, emulator dalam talian Windows atau emulator dalam talian MAC OS.
JADUAL:
NAMA
perlsec - Keselamatan Perl
DESCRIPTION
Perl direka bentuk untuk memudahkan program dengan selamat walaupun berjalan dengan tambahan
keistimewaan, seperti program setuid atau setgid. Tidak seperti kebanyakan cengkerang baris arahan, iaitu
berdasarkan beberapa pas penggantian pada setiap baris skrip, Perl menggunakan lebih
skim penilaian konvensional dengan lebih sedikit halangan tersembunyi. Selain itu, kerana
bahasa mempunyai lebih banyak fungsi terbina, ia boleh kurang bergantung pada luaran (dan mungkin
tidak boleh dipercayai) program untuk mencapai tujuannya.
KESELAMATAN KERENDAHAN HUBUNGI KAMI SYARIKAT
Jika anda percaya anda telah menemui kelemahan keselamatan dalam Perl, sila e-mel
[e-mel dilindungi] dengan butiran. Ini menunjukkan langganan tertutup,
senarai mel tidak diarkibkan. Sila gunakan alamat ini sahaja untuk isu keselamatan dalam Perl
teras, bukan untuk modul yang diedarkan secara bebas pada CPAN.
KESELAMATAN MEKANISME DAN KEBIMBANGAN
Taint mod
Perl secara automatik mendayakan satu set pemeriksaan keselamatan khas, dipanggil mencemarkan mod, bila ia
mengesan programnya berjalan dengan ID pengguna atau kumpulan sebenar dan berkesan yang berbeza. The
bit setuid dalam kebenaran Unix ialah mod 04000, mod bit setgid 02000; sama ada atau kedua-duanya
boleh ditetapkan. Anda juga boleh mendayakan mod taint secara eksplisit dengan menggunakan -T bendera baris arahan.
Bendera ini adalah kuat dicadangkan untuk program pelayan dan sebarang program yang dijalankan bagi pihak
orang lain, seperti skrip CGI. Setelah mod taint dihidupkan, ia dihidupkan untuk baki
skrip anda.
Semasa dalam mod ini, Perl mengambil langkah berjaga-jaga khas yang dipanggil mencemarkan cek untuk mengelakkan kedua-duanya
perangkap yang jelas dan halus. Sesetengah semakan ini agak mudah, seperti pengesahan
bahawa direktori laluan tidak boleh ditulis oleh orang lain; pengaturcara berhati-hati sentiasa menggunakan
pemeriksaan seperti ini. Semakan lain, bagaimanapun, paling baik disokong oleh bahasa itu sendiri, dan
semakan ini terutamanya yang menyumbang kepada menjadikan program Perl set-id lebih selamat
daripada program C yang sepadan.
Anda tidak boleh menggunakan data yang diperoleh dari luar program anda untuk mempengaruhi sesuatu yang lain di luar
program anda--sekurang-kurangnya, bukan secara tidak sengaja. Semua hujah baris arahan, persekitaran
pembolehubah, maklumat tempat (lihat perllocale), keputusan panggilan sistem tertentu
("readdir()", "readlink()", pembolehubah "shmread()", mesej yang dikembalikan oleh
"msgrcv()", kata laluan, medan gcos dan shell dikembalikan oleh panggilan "getpwxxx()") dan
semua input fail ditandakan sebagai "tercemar". Data tercemar tidak boleh digunakan secara langsung atau
secara tidak langsung dalam mana-mana arahan yang memanggil sub-kulit, mahupun dalam mana-mana perintah yang mengubah suai
fail, direktori atau proses, bersama yang berikutan pengecualian:
· Hujah untuk "mencetak" dan "syswrite" adalah tidak diperiksa untuk kekotoran.
· Kaedah simbolik
$obj->$method(@args);
dan sub rujukan simbolik
&{$foo}(@args);
$foo->(@args);
tidak diperiksa untuk kecemaran. Ini memerlukan lebih berhati-hati melainkan anda mahu
data luaran untuk menjejaskan aliran kawalan anda. Melainkan anda berhati-hati mengehadkan apa ini
nilai simbolik ialah, orang boleh memanggil fungsi di luar kod Perl anda, seperti
POSIX::system, dalam hal ini mereka dapat menjalankan kod luaran sewenang-wenangnya.
· Kekunci cincang ialah pernah tercemar.
Atas sebab kecekapan, Perl mengambil pandangan konservatif sama ada data tercemar. Jika an
ungkapan mengandungi data tercemar, sebarang subungkapan boleh dianggap tercemar, walaupun jika
nilai subungkapan itu sendiri tidak dipengaruhi oleh data yang tercemar.
Kerana kekotoran dikaitkan dengan setiap nilai skalar, beberapa elemen tatasusunan atau
hash boleh tercemar dan yang lain tidak. Kunci cincang ialah pernah tercemar.
Sebagai contoh:
$arg = anjakan; # $arg tercemar
$hid = $arg . 'bar'; # $hid juga tercemar
$line = <>; # Tercemar
$line = ; # Juga tercemar
buka FOO, "/home/me/bar" atau mati $!;
$line = ; # Masih tercemar
$path = $ENV{'PATH'}; # Tercemar, tetapi lihat di bawah
$data = 'abc'; # Tidak tercemar
sistem "echo $arg"; # Tidak selamat
sistem "/bin/echo", $arg; # Dianggap tidak selamat
# (Perl tidak tahu tentang /bin/echo)
sistem "echo $hid"; # Tidak selamat
sistem "echo $data"; # Tidak selamat sehingga PATH ditetapkan
$path = $ENV{'PATH'}; # $path kini tercemar
$ENV{'PATH'} = '/ bin:/ usr / bin';
padamkan @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
$path = $ENV{'PATH'}; # $path kini TIDAK tercemar
sistem "echo $data"; # Selamat sekarang!
open(FOO, "< $arg"); # OK - fail baca sahaja
open(FOO, "> $arg"); # Tidak OK - cuba menulis
open(FOO,"echo $arg|"); # Tidak baik
buka(FOO,"-|")
atau exec 'gema', $arg; # Juga tidak OK
$jerit = `gema $arg`; # Tidak selamat, $jerit kini tercemar
nyahpaut $data, $arg; # Tidak selamat
umask $arg; # Tidak selamat
exec "echo $arg"; # Tidak selamat
exec "echo", $arg; # Tidak selamat
exec "sh", '-c', $arg; # Sangat tidak selamat!
@files = <*.c>; # tidak selamat (menggunakan readdir() atau serupa)
@files = glob('*.c'); # tidak selamat (menggunakan readdir() atau serupa)
# Dalam kedua-dua kes, keputusan glob tercemar, kerana senarai
# nama fail datang dari luar program.
$buruk = ($arg, 23); # $buruk akan tercemar
$arg, `benar`; # Tidak selamat (walaupun tidak begitu)
Jika anda cuba melakukan sesuatu yang tidak selamat, anda akan mendapat ralat maut yang mengatakan sesuatu seperti itu
"Pergantungan tidak selamat" atau "$ENV{PATH} tidak selamat".
Pengecualian kepada prinsip "satu nilai tercemar mencemarkan keseluruhan ungkapan" adalah dengan
pengendali bersyarat ternary "?:". Sejak kod dengan syarat ternary
$result = $tainted_value ? "Tidak tercemar" : "Juga tidak tercemar";
adalah dengan berkesan
jika ( $tainted_value ) {
$result = "Tidak tercemar";
} Lain {
$result = "Juga tidak dicemari";
}
tidak masuk akal untuk $hasil tercemar.
Pengubahan wang haram and Mengesan Tercemar Tarikh
Untuk menguji sama ada pembolehubah mengandungi data yang tercemar, dan penggunaannya akan mencetuskan
Mesej "kebergantungan tidak selamat", anda boleh menggunakan fungsi "tainted()" Scalar::Util
modul, tersedia dalam cermin CPAN berdekatan anda, dan disertakan dalam Perl bermula dari
keluaran 5.8.0. Atau anda mungkin boleh menggunakan fungsi "is_tainted()" berikut.
sub is_tainted {
tempatan $@; # Jangan mencemarkan nilai pemanggil.
kembali! eval { eval("#" . substr(join("", @_), 0, 0)); 1};
}
Fungsi ini menggunakan fakta bahawa kehadiran data yang tercemar di mana-mana sahaja dalam
ungkapan menjadikan keseluruhan ungkapan tercemar. Ia akan menjadi tidak cekap untuk setiap
pengendali untuk menguji setiap hujah untuk kekotoran. Sebaliknya, sedikit lebih cekap dan
pendekatan konservatif digunakan jika mana-mana nilai tercemar telah diakses dalam yang sama
ungkapan, keseluruhan ungkapan itu dianggap tercemar.
Tetapi ujian untuk kecemaran membawa anda hanya setakat ini. Kadang-kadang anda hanya perlu membersihkan anda
kekotoran data. Nilai mungkin tidak tercemar dengan menggunakannya sebagai kunci dalam cincang; sebaliknya
satu-satunya cara untuk memintas mekanisme pencemar adalah dengan merujuk subcorak daripada biasa
padanan ungkapan. Perl menganggap bahawa jika anda merujuk subrentetan menggunakan $1, $2, dsb. dalam a
corak tidak mencemarkan, bahawa anda tahu apa yang anda lakukan semasa anda menulis corak itu. Itu
bermakna menggunakan sedikit pemikiran--jangan hanya membuta tuli tidak mengotorkan apa-apa, atau anda mengalahkan
keseluruhan mekanisme. Adalah lebih baik untuk mengesahkan bahawa pembolehubah hanya mempunyai aksara yang baik (untuk
nilai tertentu "baik") dan bukannya menyemak sama ada ia mempunyai sebarang watak buruk. Itu
kerana terlalu mudah untuk terlepas watak jahat yang tidak pernah anda fikirkan.
Berikut ialah ujian untuk memastikan bahawa data tidak mengandungi apa-apa selain aksara "perkataan".
(abjad, angka dan garis bawah), tanda sempang, tanda at atau titik.
jika ($data =~ /^([-\@\w.]+)$/) {
$data = $1; # $data kini tidak tercemar
} Lain {
mati "Data buruk dalam '$data'"; # log ini di suatu tempat
}
Ini agak selamat kerana "/\w+/" biasanya tidak sepadan dengan aksara meta shell dan juga
titik, sengkang, atau pada bermaksud sesuatu yang istimewa kepada cangkerang. Penggunaan "/.+/" akan ada
tidak selamat dalam teori kerana ia membenarkan segala-galanya, tetapi Perl tidak menyemaknya
itu. Pengajarannya ialah apabila tidak mengotorkan, anda mesti sangat berhati-hati dengan anda
corak. Data pencucian menggunakan ungkapan biasa ialah hanyalah mekanisme untuk tidak mengotorkan
data kotor, melainkan anda menggunakan strategi yang diperincikan di bawah untuk mengurangkan anak yang lebih rendah
keistimewaan.
Contoh tidak mengotorkan $data jika "use locale" berkuat kuasa, kerana aksara
dipadankan dengan "\w" ditentukan oleh tempat. Perl menganggap bahawa definisi setempat adalah
tidak boleh dipercayai kerana ia mengandungi data dari luar program. Jika anda menulis a
program setempat-sedar dan ingin mencuci data dengan ungkapan biasa yang mengandungi "\w",
letakkan "no locale" di hadapan ungkapan dalam blok yang sama. Lihat "SECURITY" dalam perllocale
untuk perbincangan dan contoh lanjut.
Beralih On yang "#!" Talian
Apabila anda membuat skrip boleh laku, untuk menjadikannya boleh digunakan sebagai arahan, sistem
akan menghantar suis kepada perl daripada # skrip! barisan. Perl menyemak bahawa mana-mana baris arahan
suis yang diberikan kepada skrip setuid (atau setgid) sebenarnya sepadan dengan skrip yang ditetapkan pada #! barisan.
Sesetengah persekitaran seperti Unix dan Unix mengenakan had satu suis pada #! talian, jadi anda boleh
perlu menggunakan sesuatu seperti "-wU" dan bukannya "-w -U" di bawah sistem sedemikian. (Tisu ini
sepatutnya timbul hanya dalam persekitaran seperti Unix atau Unix yang menyokong #! dan setuid atau setgid
skrip.)
Taint mod and @INC
Apabila mod taint ("-T") berkuat kuasa, "." direktori dialih keluar daripada @INC, dan
pembolehubah persekitaran "PERL5LIB" dan "PERLLIB" diabaikan oleh Perl. Anda masih boleh menyesuaikan diri
@INC dari luar program dengan menggunakan pilihan baris arahan "-I" seperti yang dijelaskan dalam
perlrun. Kedua-dua pembolehubah persekitaran diabaikan kerana ia dikaburkan, dan pengguna
menjalankan program mungkin tidak menyedari bahawa ia telah ditetapkan, sedangkan pilihan "-I" jelas
kelihatan dan oleh itu dibenarkan.
Satu lagi cara untuk mengubah suai @INC tanpa mengubah suai program, adalah dengan menggunakan pragma "lib",
cth:
program perl -Mlib=/foo
Faedah menggunakan "-Mlib=/foo" berbanding "-I/foo", ialah yang pertama akan secara automatik
mengalih keluar mana-mana direktori pendua, manakala yang kedua tidak akan.
Ambil perhatian bahawa jika rentetan tercemar ditambahkan pada @INC, masalah berikut akan dilaporkan:
Kebergantungan tidak selamat dalam memerlukan semasa berjalan dengan suis -T
Pembersihan Up Jalan
Untuk mesej "Tidak selamat $ENV{PATH}", anda perlu menetapkan $ENV{'PATH'} kepada nilai yang diketahui dan
setiap direktori dalam laluan mestilah mutlak dan tidak boleh ditulis oleh orang lain daripada pemiliknya dan
kumpulan. Anda mungkin terkejut apabila mendapat mesej ini walaupun nama laluan kepada boleh laku anda
adalah berkelayakan sepenuhnya. Ini adalah tidak dijana kerana anda tidak membekalkan laluan penuh ke
program; sebaliknya, ia dijana kerana anda tidak pernah menetapkan pembolehubah persekitaran PATH anda, atau
anda tidak menetapkannya kepada sesuatu yang selamat. Kerana Perl tidak dapat menjamin bahawa
boleh laku yang dimaksudkan itu sendiri tidak akan berpusing dan melaksanakan beberapa program lain
yang bergantung pada PATH anda, ia memastikan anda menetapkan PATH.
PATH bukan satu-satunya pembolehubah persekitaran yang boleh menyebabkan masalah. Kerana beberapa
shell boleh menggunakan pembolehubah IFS, CDPATH, ENV, dan BASH_ENV, Perl menyemak bahawa ia adalah
sama ada kosong atau tidak tercemar semasa memulakan subproses. Anda mungkin ingin menambah sesuatu seperti
ini kepada skrip setid dan semakan noda anda.
padamkan @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # Jadikan %ENV lebih selamat
Anda juga mungkin menghadapi masalah dengan operasi lain yang tidak peduli sama ada operasi itu
menggunakan nilai yang tercemar. Gunakan ujian fail dengan bijak dalam berurusan dengan mana-mana pengguna-
nama fail yang dibekalkan. Apabila boleh, lakukan pembukaan dan sebagainya selepas betul menjatuhkan mana-mana istimewa
keistimewaan pengguna (atau kumpulan!). Perl tidak menghalang anda daripada membuka nama fail yang tercemar untuk
membaca, jadi berhati-hati dengan apa yang anda cetak. Mekanisme pencemar bertujuan untuk mencegah
kesilapan bodoh, bukan untuk menghilangkan keperluan untuk berfikir.
Perl tidak memanggil shell untuk mengembangkan kad liar apabila anda lulus "sistem" dan "exec"
senarai parameter eksplisit dan bukannya rentetan dengan kemungkinan kad bebas shell di dalamnya.
Malangnya, fungsi "terbuka", "glob" dan tanda belakang tidak memberikan alternatif sedemikian
konvensyen panggilan, jadi lebih banyak tipu daya akan diperlukan.
Perl menyediakan cara yang agak selamat untuk membuka fail atau paip daripada setuid atau setgid
program: hanya buat proses kanak-kanak dengan keistimewaan yang dikurangkan yang melakukan kerja kotor
awak. Mula-mula, garpu kanak-kanak menggunakan sintaks "terbuka" khas yang menghubungkan ibu bapa dan
kanak-kanak dengan paip. Kini kanak-kanak itu menetapkan semula set IDnya dan sebarang atribut setiap proses yang lain,
seperti pembolehubah persekitaran, umasks, direktori kerja semasa, kembali kepada asal atau
nilai selamat yang diketahui. Kemudian proses kanak-kanak, yang tidak lagi mempunyai sebarang kebenaran khas,
adakah "terbuka" atau panggilan sistem lain. Akhirnya, kanak-kanak itu menghantar data yang berjaya dicapainya
akses kembali kepada ibu bapa. Kerana fail atau paip dibuka pada kanak-kanak semasa berlari
di bawah keistimewaan yang kurang daripada ibu bapa, ia tidak sesuai untuk ditipu untuk melakukan sesuatu
tidak sepatutnya.
Berikut ialah cara untuk melakukan backtick dengan munasabah selamat. Perhatikan bagaimana "exec" tidak dipanggil dengan
rentetan yang cangkerang boleh berkembang. Ini adalah cara terbaik untuk memanggil sesuatu itu
mungkin tertakluk kepada pelarian shell: cuma jangan panggil shell sama sekali.
menggunakan bahasa Inggeris;
mati "Tidak boleh garpu: $!" melainkan ditakrifkan($pid = open(KID, "-|"));
jika ($pid) { # ibu bapa
sementara ( ) {
# lakukan sesuatu
}
dekat KID;
} Lain {
my @temp = ($EUID, $EGID);
$orig_uid saya = $UID;
my $orig_gid = $GID;
$EUID = $UID;
$EGID = $GID;
# Menggugurkan keistimewaan
$UID = $orig_uid;
$GID = $orig_gid;
# Pastikan priv benar-benar hilang
($EUID, $EGID) = @temp;
mati "Tidak boleh menggugurkan keistimewaan"
melainkan $UID == $EUID && $GID eq $EGID;
$ENV{PATH} = "/ bin:/ usr / bin"; # LALUAN Minimum.
# Pertimbangkan untuk membersihkan persekitaran dengan lebih baik lagi.
exec 'myprog', 'arg1', 'arg2'
atau mati "tidak boleh melaksanakan myprog: $!";
}
Strategi serupa akan berfungsi untuk pengembangan kad bebas melalui "glob", walaupun anda boleh menggunakannya
"readdir" sebaliknya.
Pemeriksaan noda adalah paling berguna apabila walaupun anda percaya diri anda tidak menulis a
program untuk memberikan ladang, anda tidak semestinya mempercayai mereka yang akhirnya tidak menggunakannya
untuk cuba menipunya untuk melakukan sesuatu yang buruk. Ini adalah jenis pemeriksaan keselamatan
berguna untuk program set-id dan program yang dilancarkan bagi pihak orang lain, seperti CGI
program.
Ini agak berbeza, bagaimanapun, daripada tidak mempercayai penulis kod untuk tidak mencuba
untuk melakukan sesuatu yang jahat. Itulah jenis kepercayaan yang diperlukan apabila seseorang menyerahkan program kepada anda
anda tidak pernah melihat sebelum ini dan berkata, "Sini, jalankan ini." Untuk keselamatan seperti itu, anda mungkin
ingin menyemak modul Selamat, termasuk standard dalam pengedaran Perl. ini
modul membenarkan pengaturcara untuk menyediakan petak khas di mana semua operasi sistem
terperangkap dan akses ruang nama dikawal dengan teliti. Selamat tidak boleh dipertimbangkan
kalis peluru, walaupun: ia tidak akan menghalang kod asing untuk menyediakan gelung tak terhingga,
memperuntukkan gigabait memori, atau bahkan menyalahgunakan pepijat perl untuk membuat penterjemah hos ranap
atau berkelakuan dengan cara yang tidak dapat diramalkan. Walau apa pun, ia lebih baik dielakkan sepenuhnya jika anda
sangat mementingkan keselamatan.
Keselamatan bugs
Di sebalik masalah yang jelas yang berpunca daripada memberi keistimewaan kepada sistem sebagai
fleksibel sebagai skrip, pada banyak versi Unix, skrip set-id sememangnya tidak selamat
dari awal lagi. Masalahnya ialah keadaan perlumbaan dalam kernel. Antara masa
kernel membuka fail untuk melihat penterjemah yang hendak dijalankan dan bila (now-set-id)
jurubahasa berpaling dan membuka semula fail untuk mentafsirnya, fail yang berkenaan mungkin
telah berubah, terutamanya jika anda mempunyai pautan simbolik pada sistem anda.
Nasib baik, kadangkala "ciri" kernel ini boleh dilumpuhkan. Malangnya, ada
dua cara untuk melumpuhkannya. Sistem hanya boleh mengharamkan skrip dengan mana-mana set bit set-id,
yang tidak banyak membantu. Secara bergantian, ia boleh mengabaikan bit set-id pada skrip.
Walau bagaimanapun, jika ciri skrip set-id kernel tidak dilumpuhkan, Perl akan merungut dengan kuat
bahawa skrip set-id anda tidak selamat. Anda perlu sama ada melumpuhkan set-id kernel
ciri skrip, atau letakkan pembalut C di sekeliling skrip. Pembalut AC hanya disusun
program yang tidak melakukan apa-apa kecuali memanggil program Perl anda. Program yang disusun tidak
tertakluk kepada pepijat kernel yang melanda skrip set-id. Berikut adalah pembungkus ringkas, ditulis
dalam C:
#define REAL_PATH "/path/to/script"
utama(ac, av)
char **av;
{
execv(REAL_PATH, av);
}
Susun pembungkus ini menjadi boleh laku binari dan kemudian buat it bukannya skrip anda
setuid atau setgid.
Dalam beberapa tahun kebelakangan ini, vendor telah mula membekalkan sistem bebas daripada pepijat keselamatan yang wujud ini.
Pada sistem sedemikian, apabila kernel menghantar nama skrip set-id untuk dibuka ke
penterjemah, daripada menggunakan nama laluan tertakluk kepada campur tangan, ia sebaliknya lulus
/dev/fd/3. Ini adalah fail khas yang telah dibuka pada skrip, supaya tidak ada
keadaan perlumbaan untuk skrip jahat untuk dieksploitasi. Pada sistem ini, Perl harus disusun
dengan "-DSETUID_SCRIPTS_ARE_SECURE_NOW". The Konfigurasi program yang membina Perl cuba untuk
fikirkan ini untuk dirinya sendiri, jadi anda tidak perlu menentukannya sendiri. Paling
keluaran moden SysVr4 dan BSD 4.4 menggunakan pendekatan ini untuk mengelakkan perlumbaan kernel
keadaan.
Melindungi Program
Terdapat beberapa cara untuk menyembunyikan sumber kepada program Perl anda, dengan tahap yang berbeza-beza
daripada "keselamatan".
Pertama sekali, bagaimanapun, anda tidak boleh mengambil kebenaran membaca, kerana kod sumber perlu
boleh dibaca untuk disusun dan ditafsirkan. (Itu tidak bermakna CGI
sumber skrip boleh dibaca oleh orang di web, walaupun.) Jadi anda perlu meninggalkan
kebenaran di peringkat mesra sosial 0755. Ini membolehkan orang pada sistem setempat anda
lihat sumber anda sahaja.
Sesetengah orang tersilap menganggap ini sebagai masalah keselamatan. Jika program anda tidak selamat
perkara, dan bergantung pada orang yang tidak tahu bagaimana untuk mengeksploitasi rasa tidak selamat itu, ia tidak
selamat. Selalunya mungkin bagi seseorang untuk menentukan perkara yang tidak selamat dan mengeksploitasi
mereka tanpa melihat sumbernya. Keselamatan melalui kesamaran, nama untuk menyembunyikan anda
pepijat dan bukannya membetulkannya, sebenarnya adalah sedikit keselamatan.
Anda boleh cuba menggunakan penyulitan melalui penapis sumber (Penapis::* daripada CPAN, atau
Tapis::Util::Panggilan dan Tapis::Mudah sejak Perl 5.8). Tetapi keropok mungkin boleh
menyahsulitnya. Anda boleh cuba menggunakan pengkompil kod bait dan penterjemah yang diterangkan di bawah, tetapi
keropok mungkin boleh menyahkompilasinya. Anda boleh cuba menggunakan pengkompil kod asli
diterangkan di bawah, tetapi keropok mungkin boleh membukanya. Ini menimbulkan tahap yang berbeza-beza
kesukaran kepada orang yang ingin mendapatkan kod anda, tetapi tiada siapa yang boleh menyembunyikannya secara pasti
(ini berlaku untuk setiap bahasa, bukan hanya Perl).
Jika anda bimbang tentang orang yang mendapat keuntungan daripada kod anda, maka kesimpulannya ialah itu
tiada apa-apa selain lesen yang terhad akan memberi anda keselamatan undang-undang. Lesenkan perisian anda dan
lada dengan kenyataan mengancam seperti "Ini adalah perisian proprietari yang tidak diterbitkan
XYZ Corp. Akses anda kepadanya tidak memberi anda kebenaran untuk menggunakannya bla bla bla." Anda
harus berjumpa peguam untuk memastikan kata-kata lesen anda akan diperkatakan di mahkamah.
Unicode
Unicode ialah teknologi baharu dan kompleks dan seseorang itu boleh mengabaikan keselamatan tertentu dengan mudah
perangkap. Lihat perluniintro untuk gambaran keseluruhan dan perlunicode untuk butiran dan "Keselamatan
Implikasi Unicode" dalam perlunicode untuk implikasi keselamatan khususnya.
Algoritma kerumitan Serangan
Algoritma dalaman tertentu yang digunakan dalam pelaksanaan Perl boleh diserang dengan memilih
input dengan berhati-hati untuk menggunakan jumlah yang besar sama ada masa atau ruang atau kedua-duanya. Ini boleh
membawa kepada apa yang dipanggil Penafian of Servis (DoS) serangan.
· Algoritma Hash - Algoritma hash seperti yang digunakan dalam Perl terkenal
terdedah kepada serangan perlanggaran pada fungsi cincang mereka. Serangan sedemikian melibatkan
membina satu set kunci yang berlanggar ke dalam baldi yang sama menghasilkan tidak cekap
tingkah laku. Serangan sedemikian selalunya bergantung pada penemuan benih fungsi cincang yang digunakan
untuk memetakan kunci kepada baldi. Benih itu kemudiannya digunakan untuk memaksa set kunci yang boleh
digunakan untuk melancarkan serangan penafian perkhidmatan. Dalam Perl 5.8.1 perubahan telah diperkenalkan kepada
mengeraskan Perl kepada serangan sedemikian, dan kemudian dalam Perl 5.18.0 ciri-ciri ini adalah
dipertingkatkan dan perlindungan tambahan ditambah.
Pada masa artikel ini ditulis, Perl 5.18.0 dianggap sangat kukuh terhadapnya
serangan kerumitan algoritma pada pelaksanaan cincangnya. Ini sebahagian besarnya terhutang kepada
langkah-langkah berikut mengurangkan serangan:
Rawak Benih Hash
Untuk menjadikannya mustahil untuk mengetahui benih apa untuk menjana set kunci serangan
kerana, benih ini dimulakan secara rawak pada permulaan proses. Ini mungkin ditindih
dengan menggunakan pembolehubah persekitaran PERL_HASH_SEED, lihat "PERL_HASH_SEED" dalam perlrun.
Pembolehubah persekitaran ini mengawal cara item sebenarnya disimpan, bukan bagaimana ia disimpan
dibentangkan melalui "kunci", "nilai" dan "setiap".
Randomisasi Hash Traversal
Bebas daripada benih yang digunakan dalam fungsi cincang, "kunci", "nilai", dan
"setiap" mengembalikan item dalam susunan rawak setiap cincang. Mengubah suai cincang dengan sisipan
akan mengubah susunan lelaran cincang itu. Tingkah laku ini boleh ditindih oleh
menggunakan "hash_traversal_mask()" daripada Hash::Util atau dengan menggunakan PERL_PERTURB_KEYS
pembolehubah persekitaran, lihat "PERL_PERTURB_KEYS" dalam perlrun. Perhatikan bahawa ciri ini
mengawal susunan "kelihatan" kunci, dan bukan susunan sebenar ia disimpan
masuk
Gangguan Pesanan Baldi
Apabila item berlanggar ke dalam baldi cincang yang diberikan, pesanan itu disimpan dalam rantai
tidak lagi boleh diramal dalam Perl 5.18. Ini mempunyai niat untuk menjadikannya lebih sukar
untuk memerhatikan perlanggaran. Tingkah laku ini boleh diatasi dengan menggunakan
PERL_PERTURB_KEYS pembolehubah persekitaran, lihat "PERL_PERTURB_KEYS" dalam perlrun.
Fungsi Cincang Lalai Baharu
Fungsi cincang lalai telah diubah suai dengan tujuan untuk menjadikannya lebih sukar
untuk membuat kesimpulan benih hash.
Fungsi Hash Alternatif
Kod sumber termasuk berbilang algoritma cincang untuk dipilih. Sedangkan kita
percaya bahawa cincangan perl lalai adalah teguh untuk menyerang, kami telah memasukkan cincangan tersebut
fungsi Siphash sebagai pilihan mundur. Pada masa keluaran Perl 5.18.0
Siphash dipercayai mempunyai kekuatan kriptografi. Ini bukan lalai sebagai
ia jauh lebih perlahan daripada cincang lalai.
Tanpa menyusun Perl khas, tidak ada cara untuk mendapatkan tingkah laku yang sama persis
sebarang versi sebelum Perl 5.18.0. Yang paling dekat boleh dapatkan adalah dengan menetapkan
PERL_PERTURB_KEYS kepada 0 dan menetapkan PERL_HASH_SEED kepada nilai yang diketahui. Kita tidak
nasihatkan tetapan tersebut untuk kegunaan pengeluaran kerana pertimbangan keselamatan di atas.
Perl mempunyai pernah dijamin mana-mana pesanan of yang hash kunci, dan pesanan telah pun
berubah beberapa kali sepanjang hayat Perl 5. Juga, pesanan kunci cincang
sentiasa, dan terus, dipengaruhi oleh susunan sisipan dan sejarah
perubahan yang dibuat pada cincang sepanjang hayatnya.
Juga ambil perhatian bahawa walaupun susunan elemen cincang mungkin rawak, ini "pseudo-
memesan" sepatutnya tidak digunakan untuk aplikasi seperti merombak senarai secara rawak (gunakan
"List::Util::shuffle()" untuk itu, lihat List::Util, modul teras standard sejak Perl
5.8.0; atau modul CPAN "Algoritma::Numerical::Shuffle"), atau untuk penjanaan
pilih atur (gunakan contohnya modul CPAN "Algoritma::Permute" atau
"Algoritma::FastPermute"), atau untuk sebarang aplikasi kriptografi.
Cincang terikat mungkin mempunyai serangan kerumitan susunan dan algoritma sendiri.
· Ungkapan biasa - Enjin ungkapan biasa Perl dipanggil NFA (Bukan-
deterministik Finite Automaton), yang antara lain bermakna ia boleh agak
dengan mudah mengambil sejumlah besar masa dan ruang jika ungkapan biasa boleh
sepadan dalam beberapa cara. Penciptaan ekspresi biasa yang teliti boleh membantu tetapi agak
selalunya tidak banyak yang boleh dilakukan (buku "Menguasai Ungkapan Biasa" adalah
bacaan yang diperlukan, lihat perlfaq2). Kehabisan ruang ditunjukkan oleh Perl
kehabisan ingatan.
· Isih - algoritma quicksort yang digunakan dalam Perls sebelum 5.8.0 untuk melaksanakan urutkan ()
fungsi sangat mudah untuk ditipu menjadi salah laku sehingga memakan banyak masa.
Bermula dari Perl 5.8.0, algoritma pengisihan yang berbeza, mergesort, digunakan secara lalai.
Mergesort tidak boleh salah laku pada sebarang input.
Lihathttp://www.cs.rice.edu/~scrosby/hash/> untuk maklumat lanjut, dan sebarang sains komputer
buku teks tentang kerumitan algoritma.
Gunakan perlsec dalam talian menggunakan perkhidmatan onworks.net