Sekilas VFS pada linux kernel 2.4 [vfs] Sekilas VFS pada linux kernel 2.4 [vfs] vfs (virtual file system) merupakan layanan file system yang disediakan oleh kernel untuk tampilan filesystem di user space. karena hanya berupa tampilan virtual maka kita sebut sbg pseudo file system. [/proc/net filesystem] dengan memodifikasi struktur proc_dir_entry pada vfs digunakan untuk menyembunyikan koneksi, misal dari program 2 yang mencoba membaca2 socket2 dari /proc/net/* misal pada netstat akan membaca dari /proc/net/tcp / /proc/net/udp , dll ==== if (flags & NETSTAT_TCP) { do_info("/proc/net/tcp", tcp_do_one); #if ENABLE_FEATURE_IPV6 do_info("/proc/net/tcp6", tcp_do_one); #endif } if (flags & NETSTAT_UDP) { do_info("/proc/net/udp", udp_do_one); #if ENABLE_FEATURE_IPV6 do_info("/proc/net/udp6", udp_do_one); #endif } if (flags & NETSTAT_RAW) { do_info("/proc/net/raw", raw_do_one); #if ENABLE_FEATURE_IPV6 do_info("/proc/net/raw6", raw_do_one); #endif } ============== do_info digunakan untuk membaca /proc/net/* dengan menggunakan fungsi fopen_or_warn_stdin. ======================= struct proc_dir_entry { ............................ int (*get_info)(buffer, start, off, count); int (*read_proc) (buffer, start, off, count, eof, data); ......................... }; ================= struktur proc_dir_entry berisi : int (*get_info)(buffer, start, off, count); yang merupakan function pointer. jika proc_dir_entry tidak ada int (*get_info) maka akan digunakan int (*read_proc), misal saat get_info , salah satu teknik attacker untuk menyembunyikan proses dengan meredirect fungsi get_info di contoh di bawah dengan fungsi new_get_info: ============= int new_get_info (char *a, char **b, off_t c, int d, int e) { int x = 0; x = saved_get_info (a, b, c, d, e); /* do something here ... */ return x; } =============== sebelumnya telah kita definisikan dengan: ================== int (*saved_get_info)(char *, char **, off_t, int, int); =================== teknik yang dilakukan hanya melakukan redireksi pointer get_info untuk menunjuk ke fungsi redireksi :"new_get_info" yang telah disiapkan. ================= saved_get_info = a->get_info; a->get_info = &new_get_info; ================== sehingga a->get_info akan menunjuk pada alamat fungsi new_get_info di memori. jika kita lihat pada new_get_info: ======================= return x; ======================= yang akan melakukan jmp kembali karena: ================== x = saved_get_info (a, b, c, d, e); ==================== karena x menyimpan alamat asli get_info [menyembunyikan proses tanpa modifikasi syscall ] elf "ps" saat dijalankan akan membaca proses pada /proc dg readdir, coba perhatikan potongan kode ini: ========= while ((entry = readdir(dir)) != NULL) { uidName[0] = '\0'; groupName[0] = '\0'; if (!isdigit(*entry->d_name)) continue; sprintf(path, "/proc/%s/status", entry->d_name); if ((file2str(path, sbuf, sizeof sbuf)) != -1) { parse_proc_status(sbuf, &p); } dst...... ============== potongan kode di atas berada pada fungsi ps_main yang akan dijalankan saat seorang user menjalankan elf lsb executable ps, di mana kita bisa melihat penggunaan fungsi readdir teknik yang bisa kita lakukan dengan redirek pointer ke fungsi readdir misal dengan fungsi palsu new_readdir_root: ========== /* replace the readdir file operation. */ proc_root.FILE_OPS->readdir = new_readdir_root; ============