Melewati kata sandi pada baris perintah (ke proses anak dimulai dari program saya) diketahui tidak aman (karena dapat dilihat bahkan oleh pengguna lain dengan perintah ps). Apakah boleh untuk meneruskannya sebagai variabel lingkungan?
Apa lagi yang bisa saya gunakan untuk melewatinya? (Kecuali variabel lingkungan) solusi termudah tampaknya menggunakan pipa, tetapi solusi termudah ini tidak mudah.
Saya memprogram di Perl.
environment-variables
fork
ipc
porton
sumber
sumber
Jawaban:
Argumen proses terlihat oleh semua pengguna, tetapi lingkungan hanya dapat dilihat oleh pengguna yang sama ( setidaknya di Linux , dan saya pikir pada setiap varian unix modern). Jadi mengirimkan kata sandi melalui variabel lingkungan adalah aman. Jika seseorang dapat membaca variabel lingkungan Anda, mereka dapat menjalankan proses seperti Anda, jadi itu sudah berakhir.
Konten lingkungan berisiko berisiko bocor secara tidak langsung, misalnya jika Anda menjalankan
ps
untuk menyelidiki sesuatu dan secara tidak sengaja menyalin-menempelkan hasilnya termasuk variabel lingkungan rahasia di tempat umum. Risiko lain adalah bahwa Anda meneruskan variabel lingkungan ke program yang tidak memerlukannya (termasuk anak-anak dari proses yang membutuhkan kata sandi) dan program itu memaparkan variabel lingkungannya karena tidak mengharapkannya dirahasiakan. Seberapa buruk risiko kebocoran sekunder ini tergantung pada apa proses dengan kata sandi itu (berapa lama itu berjalan? Apakah itu menjalankan subproses?).Lebih mudah untuk memastikan bahwa kata sandi tidak akan bocor secara tidak sengaja dengan melewatkannya melalui saluran yang tidak dirancang untuk dikuping, seperti pipa. Ini cukup mudah dilakukan di sisi pengirim. Misalnya, jika Anda memiliki kata sandi dalam variabel shell, Anda bisa melakukannya
jika
theprogram
mengharapkan kata sandi pada input standarnya. Perhatikan bahwa ini aman karenaecho
merupakan builtin; itu tidak akan aman dengan perintah eksternal karena argumen akan diekspos dalamps
output. Cara lain untuk mencapai efek yang sama adalah dengan dokumen di sini:Beberapa program yang memerlukan kata sandi dapat diperintahkan untuk membacanya dari deskriptor file tertentu. Anda dapat menggunakan deskriptor file selain dari input standar jika Anda membutuhkan input standar untuk hal lain. Misalnya dengan
gpg
:Jika program tidak bisa disuruh membaca dari deskriptor file tetapi bisa disuruh baca dari file, Anda bisa menyuruhnya membaca dari deskriptor file dengan menggunakan nama file seperti `/ dev / fd / 3.
Di ksh, bash atau zsh, Anda bisa melakukan ini dengan lebih ringkas melalui proses substitusi.
sumber
/usr/ucb/ps
adalah setuid root sehingga dapat membaca dan menampilkan variabel lingkungan dari proses lain - ini dihapus dalam Solaris 10, jadi jawaban "setiap varian Unix modern lainnya" di atas berlaku untuk rilis Solaris mulai 2005 & yang lebih baru.Alih-alih menyampaikan kata sandi secara langsung melalui argumen atau variabel lingkungan
gunakan argumen atau variabel lingkungan yang sama untuk meneruskan nama file :
Kemudian Anda dapat melewati baik izin yang dilindungi file biasa (meskipun itu tidak akan melindungi Anda dari proses lain yang berjalan di bawah pengguna yang sama), atau
/dev/stdin
dan pipa di (yang AFAIK akan melindungi Anda dari proses lain yang berjalan di bawah pengguna yang sama):Jika Anda menggunakan di
/dev/stdin
sini, sangat penting bahwa itu adalah pipa . Jika terminal, itu akan dapat dibaca oleh proses lain yang berjalan di bawah pengguna yang sama.Jika Anda sudah perlu menggunakan Anda
/dev/stdin
untuk sesuatu yang lain, Anda bisa menggunakan subtitusi proses jika Anda menggunakan shell yang mendukungnya, yang pada dasarnya setara dengan menggunakan pipa:Named pipes (FIFOs) mungkin terlihat sama, tetapi dapat disadap.
Solusi-solusi ini juga tidak sepenuhnya aman , tetapi mereka mungkin cukup dekat asalkan Anda tidak berada pada sistem dengan keterbatasan memori yang banyak bertukar.
Idealnya, Anda akan membaca file-file ini (pipa juga file) ke dalam memori yang ditandai dengan mlock (2) sebagai nonswappable, yang biasanya dilakukan oleh program penanganan kata sandi seperti gnupg.
Catatan:
Melewati angka-angka yang diajukan secara teoritis sama baiknya dengan mengarsipkan nama file, tetapi nama file lebih praktis, karena
<()
memberi Anda nama file, bukan angka yang diajukan (dancoproc
memberi Anda penanda file yang ditandai FD_CLOEXEC , yang membuat file-file tersebut tidak dapat digunakan dalam konteks ini).Jika Anda menggunakan sistem Linux di mana
/proc/sys/kernel/yama/ptrace_scope
diatur ke0
, maka AFAIK, tidak ada cara antipeluru untuk melindungi diri dari proses lain yang berjalan di bawah pengguna yang sama (mereka dapat menggunakan ptrace untuk melampirkan ke proses Anda dan membaca memori Anda)Jika Anda hanya perlu menjauhkan kata sandi dari proses yang berjalan di bawah pengguna yang berbeda (bukan root), maka argumen, variabel lingkungan, pipa dan file yang dilindungi izin semua akan dilakukan.
sumber
Tidak, variabel lingkungan juga mudah dibaca, dan bocor ke proses anak. melewatinya menggunakan pipa.
sumber
ps
dan/proc
dapat melihatnya.ptrace()
target dan membaca ingatannya.Jika tidak ada yang cocok, pertimbangkan layanan Retensi Kunci Linux (keyrings kernel).
Mulai di: security / keys.txt . Salah satu keyrings default dapat dikloning antara proses induk dan anak.
Ini bukan solusi paling sederhana, tetapi ada di sana dan tampaknya dipelihara & digunakan (itu juga terlibat dalam bug Android tahun lalu.)
Saya tidak tahu tentang status "politik" nya, tetapi saya memiliki kebutuhan yang sama, & mulai bekerja pada ikatan tipu muslihat. Belum menemukan dukungan Perl yang sudah ada.
sumber