Ketika program yang berjalan di Linux ingin menggunakan sumber daya yang dikelola oleh sistem operasi (membaca file, membuat proses, dll.), mereka membuat panggilan sistem ke OS. Panggilan sistem bekerja pada tingkat kernel dan melakukan operasi yang diperlukan, menyerahkan kendali kembali ke program panggilan. Alat strace menyediakan kemampuan untuk melacak panggilan sistem ini di Linux.

Penggunaan Khas dari Perintah strace

Untuk memantau panggilan sistem untuk suatu aplikasi, cukup panggil perintah dengan strace dalam format berikut:

strace ls /tmp

Namun, seringkali ada proses yang dimulai jauh lebih awal dan terus bekerja di latar belakang. Karena masalah apa pun, Anda mungkin ingin mengumpulkan informasi tambahan yang terkait dengan proses tersebut. Anda dapat melampirkan strace ke aplikasi yang sedang berjalan dengan memberikan ID proses dari proses ke -p parameter:

strace -p 2759

Keluaran:

Melacak Utas dan Garpu dari Aplikasi

Dengan strace, Anda dapat memeriksa semua utas dan proses anak lainnya yang merupakan cabang dari aplikasi menggunakan -f bendera.

strace -f -p 2759

Keluaran:

Periksa Panggilan Sistem Tertentu Dengan strace

Output strace default kadang-kadang bisa sangat ramai untuk diikuti. Jika Anda hanya ingin melacak panggilan sistem tertentu, Anda dapat melakukannya dengan -e parameter:

strace -f -e trace=buka, tulis, tutup, sambungkan,Pilih -p 19770

Untuk melacak hanya panggilan sistem yang terkait dengan operasi file, gunakan -e jejak=file:

strace -e trace=file -p 19770

Untuk memfilter hanya panggilan sistem terkait jaringan, tentukan -e jejak=jaringan dalam perintah:

strace -e jejak=jaringan -p 19770

Dapatkan Informasi Waktu dalam Detik

Saat mengeluarkan panggilan sistem, Anda dapat menggunakan -t parameter untuk mendapatkan informasi waktu dengan presisi dalam hitungan detik. Sebagian besar waktu presisi tidak akan cukup untuk kebutuhan Anda. Dalam situasi seperti itu, Anda dapat menggunakan -tt parameter untuk mendapatkan informasi waktu dengan presisi mikrodetik:

strace -tt ls /tmp

Kumpulkan Statistik Tentang Panggilan Sistem

Dengan -c parameter, Anda dapat mengumpulkan statistik tentang panggilan sistem selama yang Anda inginkan:

strace -f -c -p 19770

Simpan Log ke File

Jika Anda menjalankan strace untuk waktu yang lama dan ingin memeriksa log yang dihasilkan lebih detail nanti, Anda harus menyimpan log tersebut. Dengan -Hai parameter Anda dapat menentukan file di mana strace harus menyimpan log:

strace -f -o /tmp/strace.log -e trace=file ls /tmp

Proses Pemblokiran ptrace

Menggunakan panggilan sistem prctl, aplikasi apa pun di Linux dapat mencegah dirinya dari dikendalikan oleh pengguna non-root menggunakan ptrace. Jika aplikasi menghapus PR_SET_DUMPABLE menandai dirinya sendiri melalui prctl, pengguna selain root tidak akan dapat mengontrol aplikasi ini dengan ptrace, bahkan jika mereka memiliki hak untuk memberi sinyal pada aplikasi.

Salah satu penggunaan paling umum dari fitur ini terlihat pada perangkat lunak agen otentikasi OpenSSH. Dengan demikian, kontrol aplikasi oleh aplikasi lain dengan praktek dicegah pada otentikasi pengguna.

ptrace dan Keamanan

Karena fasilitas ptrace diatur dalam model proses Linux tradisional, perangkat lunak apa pun yang Anda jalankan di sistem Anda dengan pengguna Anda memiliki wewenang untuk memasukkan kode berbahaya ke dalamnya. Dari alat xterm paling sederhana hingga aplikasi browser web canggih, malware semacam itu dapat mengendalikan semua aplikasi lain yang sedang berjalan—berkat ptrace system call—dan menyalin informasi penting tanpa Anda sadari.

Menanggapi situasi ini, yang tidak disadari oleh banyak pengguna, mekanisme perlindungan telah dikembangkan dengan modul keamanan yang disebut Yama di kernel Linux.

Anda dapat mengontrol respons terhadap panggilan sistem ptrace melalui /proc/sys/kernel/yama/ptrace_scope mengajukan. Secara default, file ini menulis nilai 0.

Nilai-nilai berikut ini dapat diterima:

Nilai Berarti
0 Perilaku konvensional: Semua aplikasi yang memiliki hak untuk praktek dapat diperiksa.
1 Praktek terbatas: Hanya induk langsung dari aplikasi atau aplikasi debug yang diizinkan oleh aplikasi dengan PR_SET_PTRACER pilihan memiliki kontrol. Dengan demikian, penggunaan nama_program gdb dan strace program_name akan terus bekerja, tetapi Anda tidak akan dapat melampirkan aplikasi yang sedang berjalan sesudahnya.
2 Ptrace ke administrator sistem: Hanya aplikasi dengan definisi CAP_SYS_PTRACE properti atau proses anak yang mendefinisikan PTRACE_TRACEME pilihan dengan prctl dapat dikendalikan.
3 Benar-benar dinonaktifkan: Tidak praktek diperbolehkan dalam keadaan apapun. Jika properti ini ditentukan sekali, Anda tidak dapat mengubahnya lagi saat runtime.

Banyak pengembang tidak tahu bahwa aplikasi dapat menonaktifkan ptrace sendiri melalui prctl, kecuali untuk pengguna root. Meskipun perangkat lunak yang berhubungan dengan keamanan seperti agen OpenSSH melakukan operasi ini, tidak tepat untuk mengharapkan perilaku yang sama dari semua perangkat lunak yang berjalan pada sistem.

Baru-baru ini, beberapa distribusi Linux sudah mulai mengatur nilai default dari ptrace_scope file, dijelaskan di atas, ke 1. Jadi, dengan pembatasan operasi ptrace, lingkungan kerja yang lebih aman disediakan di seluruh sistem.

Menggunakan Contoh strace

Daftarkan contoh aplikasi di bawah ini dengan nama ministrace.c. Kemudian Anda dapat mengkompilasinya dengan perintah berikut:

gcc-Haipelayananpelayanan.c

Kode:

#termasuk <sys/ptrace.h>
#termasuk <sys/reg.h>
#termasuk <sys/tunggu.h>
#termasuk <sys/types.h>
#termasuk <unistd.h>
#termasuk <stdlib.h>
#termasuk <stdio.h>
#termasuk <errno.h>
#termasuk <string.h>
ke dalamwait_for_syscall(anak pid_t)
{
ke dalam status;
ketika (1) {
ptrace (PTRACE_SYSCALL, anak, 0, 0);
tunggu (anak, &status, 0);
jika (WIFSTOPPED(status) && WSTOPSIG(status) & 0x80)
kembali0;
jika (WIFEEXITED(status))
kembali1;
}
}

ke dalamlakukan_anak(ke dalam argc, arang **argv)
{
arang *args [argc+1];
memcpy (args, argv, argc * sizeof(arang*));
args[argc] = BATAL;
ptrace (PTRACE_TRACEME);
membunuh(getpid(), SIGSTOP);
kembali execvp (args[0], argumen);
}

ke dalamlakukan_trace(anak pid_t)
{
ke dalam status, syscall, retval;
tunggu (anak, &status, 0);
ptrace (PTRACE_SETOPTIONS, anak, 0, PTRACE_O_TRACESYSGOOD);
ketika(1) {
jika (wait_for_syscall (anak) != 0) merusak;

syscall = ptrace (PTRACE_PEEKUSER, anak, sizeof(panjang)*ORIG_RAX);
fprintf (stderr, "panggilan sistem(%d) = ", panggilan);

jika (wait_for_syscall (anak) != 0) merusak;

retval = ptrace (PTRACE_PEEKUSER, anak, sizeof(panjang)*RAX);
fprintf (stderr, "%d
", pengembalian);
}
kembali0;
}
ke dalamutama(ke dalam argc, arang **argv)
{
jika (argc < 2) {
fprintf (stderr, "Penggunaan: %s argumen prog
", argv[0]);
KELUAR(1);
}
pid_t anak = garpu();
jika (anak == 0) {
kembali do_child (argc-1, argv+1);
} lain {
kembali do_trace (anak);
}
}

Setelah mengkompilasi aplikasi, Anda dapat menjalankan perintah apa pun dengan pelayanan dan periksa outputnya:

Anda Dapat Menggunakan strace untuk Banyak Tujuan

strace dapat membantu menemukan bug dalam program yang tidak perlu menggunakan sumber daya sistem. Demikian juga, karakteristik yang ditunjukkan oleh suatu program saat menggunakan sumber daya sistem operasi juga dapat diungkapkan dengan strace.

Karena strace secara langsung mendengarkan panggilan sistem, strace dapat mengungkapkan dinamika runtime terlepas dari apakah kode program yang sedang dijalankan terbuka/tertutup. Dimungkinkan untuk mendapatkan ide tentang mengapa program membuat kesalahan saat mulai menggunakan strace.

Demikian pula, strace membantu Anda memahami mengapa suatu program berhenti tiba-tiba. Oleh karena itu, mengenal strace sangat penting dalam pengembangan kernel Linux dan administrasi sistem.

Buat Sistem Operasi Anda Sendiri Dengan Linux Dari Awal [Linux]

Baca Selanjutnya

MembagikanMenciakMembagikanSurel

Topik-topik yang berkaitan

  • Linux
  • Perintah Linux
  • Kernel Linux

Tentang Penulis

Fatih Küçükkarakurt (6 Artikel Diterbitkan)

Seorang insinyur dan pengembang perangkat lunak yang merupakan penggemar matematika dan teknologi. Dia selalu menyukai komputer, matematika dan fisika. Dia telah mengembangkan proyek mesin permainan serta pembelajaran mesin, jaringan saraf tiruan dan perpustakaan aljabar linier. Selain itu terus bekerja pada pembelajaran mesin dan matriks linier.

More From Fatih Küçükkarakurt

Berlangganan newsletter kami

Bergabunglah dengan buletin kami untuk kiat teknologi, ulasan, ebook gratis, dan penawaran eksklusif!

Klik di sini untuk berlangganan