Bagaimana ps tahu menyembunyikan kata sandi?

22

Saksi:

$ ps f
  PID TTY      STAT   TIME COMMAND
31509 pts/3    Ss     0:01 -bash
27266 pts/3    S+     0:00  \_ mysql -uroot -p
25210 pts/10   Ss+    0:00 /bin/bash
24444 pts/4    Ss     0:00 -bash
29111 pts/4    S+     0:00  \_ tmux attach
 4833 pts/5    Ss+    0:00 -bash
 9046 pts/6    Ss     0:00 -bash
17749 pts/6    R+     0:00  \_ ps f
 4748 pts/0    Ss     0:00 -bash
14635 pts/0    T      0:02  \_ mysql -uroot -px xxxxxxxxxxxxxxxx
16210 pts/0    S+     0:01  \_ mysql -uroot -px xxxxxxxxxxxxxxxx

Bagaimana ps tahu menyembunyikan mysqlkata sandi? Bisakah saya memasukkan ini ke dalam skrip saya sendiri untuk menyembunyikan atribut CLI tertentu?

dotancohen
sumber
6
Ini mungkin cara lain dan mysqlmelakukan keajaiban, bukan ps: "Klien MySQL biasanya menimpa argumen kata sandi baris perintah dengan nol selama urutan inisialisasi mereka." - Panduan Pengguna Akhir untuk Keamanan Kata Sandi
manatwork
Terima kasih, itu dokumen yang informatif. Saya akan melihat bagaimana saya bisa menimpa argumen cli dalam skrip saya sendiri.
dotancohen
1
@manatwork Saya akan menempatkan itu sebagai jawaban, karena itulah yang terjadi - dan ini adalah tautan yang berguna untuk masalah keamanan mengenai mysql. :)
Drav Sloan
Perhatikan bahwa sementara argumen baris perintah dapat diintip, variabel lingkungan aman .
Gilles 'SANGAT berhenti menjadi jahat'
Untuk info lebih lanjut tentang ini, lihat unix.stackexchange.com/q/385339/135943
Wildcard

Jawaban:

23

pstidak menyembunyikan kata sandi. Aplikasi seperti mysql menimpa daftar argumen yang mereka dapatkan. Harap dicatat, bahwa ada kerangka waktu kecil (mungkin dapat diperpanjang dengan beban sistem yang tinggi), di mana argumen dapat dilihat oleh aplikasi lain hingga ditimpa. Menyembunyikan proses ke pengguna lain dapat membantu. Secara umum jauh lebih baik untuk mengirim kata sandi melalui file daripada per baris perintah.

Dalam artikel ini dijelaskan untuk C, bagaimana melakukan ini. Contoh berikut menyembunyikan / menghapus semua argumen baris perintah:

#include <string.h>

int main(int argc, char **argv)
{
    // process command line arguments....

    // hide command line arguments
    if (argc > 1) {
        char *arg_end;    
        arg_end = argv[argc-1] + strlen (argv[argc-1]);
        *arg_end = ' ';
    }

    // ...
}

Lihat juga di /programming/724582/hide-arguments-from-ps dan /programming/3830823/hiding-secret-from-command-line-parameter-on-unix .

Jofel
sumber
Bagus sekali, terima kasih. Saya tidak menyadari bahwa argumennya bisa berubah seperti itu.
dotancohen
Perhatikan juga bahwa tidak semua program akan melakukan ini dengan kata sandi.
ash
Tautan ke artikel ini rusak. Adakah yang menjelaskan kode untuk saya? (Mengapa kodenya berfungsi, cukup setel \0spasi?) Ada tautan ke setproctitle()?
schemacs
Atau jawabannya ada di sini ?
schemacs
7

Program mysql menggantikan kata sandi dari baris perintah dengan xdi baris kode ini :

while (*argument) *argument++= 'x';     // Destroy argument
schemacs
sumber
3
Sayangnya, itu tidak seaman mungkin. Anda dapat mengetahui berapa lama kata sandi tersebut. Lebih baik menggantinya dengan \0sehingga Anda memerlukan informasi tambahan untuk menemukan panjang kata sandi (tanpa UB / SEGFAULT).
wizzwizz4