Skip to content

Commit 048daa8

Browse files
authored
pkg/ebpf: enrich security_inode_unlink (#2136)
Add unlinked file info to the event, so more hermetic rules could be written over it.
1 parent 7a82831 commit 048daa8

File tree

3 files changed

+40
-6
lines changed

3 files changed

+40
-6
lines changed

pkg/ebpf/c/tracee.bpf.c

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1289,6 +1289,16 @@ static __always_inline int get_task_syscall_id(struct task_struct *task)
12891289

12901290
// HELPERS: VFS ------------------------------------------------------------------------------------
12911291

1292+
static __always_inline u64 get_ctime_nanosec_from_inode(struct inode *inode)
1293+
{
1294+
struct timespec64 ts = READ_KERN(inode->i_ctime);
1295+
time64_t sec = READ_KERN(ts.tv_sec);
1296+
if (sec < 0)
1297+
return 0;
1298+
long ns = READ_KERN(ts.tv_nsec);
1299+
return (sec * 1000000000L) + ns;
1300+
}
1301+
12921302
static __always_inline struct dentry *get_mnt_root_ptr_from_vfsmnt(struct vfsmount *vfsmnt)
12931303
{
12941304
return READ_KERN(vfsmnt->mnt_root);
@@ -1320,12 +1330,7 @@ static __always_inline unsigned long get_inode_nr_from_file(struct file *file)
13201330
static __always_inline u64 get_ctime_nanosec_from_file(struct file *file)
13211331
{
13221332
struct inode *f_inode = READ_KERN(file->f_inode);
1323-
struct timespec64 ts = READ_KERN(f_inode->i_ctime);
1324-
time64_t sec = READ_KERN(ts.tv_sec);
1325-
if (sec < 0)
1326-
return 0;
1327-
long ns = READ_KERN(ts.tv_nsec);
1328-
return (sec * 1000000000L) + ns;
1333+
return get_ctime_nanosec_from_inode(f_inode);
13291334
}
13301335

13311336
static __always_inline unsigned short get_inode_mode_from_file(struct file *file)
@@ -1387,6 +1392,25 @@ static __always_inline int check_fd_type(u64 fd, u16 type)
13871392
return 0;
13881393
}
13891394

1395+
static __always_inline unsigned long get_inode_nr_from_dentry(struct dentry *dentry)
1396+
{
1397+
struct inode *d_inode = READ_KERN(dentry->d_inode);
1398+
return READ_KERN(d_inode->i_ino);
1399+
}
1400+
1401+
static __always_inline dev_t get_dev_from_dentry(struct dentry *dentry)
1402+
{
1403+
struct inode *d_inode = READ_KERN(dentry->d_inode);
1404+
struct super_block *i_sb = READ_KERN(d_inode->i_sb);
1405+
return READ_KERN(i_sb->s_dev);
1406+
}
1407+
1408+
static __always_inline u64 get_ctime_nanosec_from_dentry(struct dentry *dentry)
1409+
{
1410+
struct inode *d_inode = READ_KERN(dentry->d_inode);
1411+
return get_ctime_nanosec_from_inode(d_inode);
1412+
}
1413+
13901414
// HELPERS: MEMORY ---------------------------------------------------------------------------------
13911415

13921416
static __always_inline struct mm_struct *get_mm_from_task(struct task_struct *task)
@@ -4003,8 +4027,14 @@ int BPF_KPROBE(trace_security_inode_unlink)
40034027
// struct inode *dir = (struct inode *)PT_REGS_PARM1(ctx);
40044028
struct dentry *dentry = (struct dentry *) PT_REGS_PARM2(ctx);
40054029
void *dentry_path = get_dentry_path_str(dentry);
4030+
unsigned long inode_nr = get_inode_nr_from_dentry(dentry);
4031+
dev_t dev = get_dev_from_dentry(dentry);
4032+
u64 ctime = get_ctime_nanosec_from_dentry(dentry);
40064033

40074034
save_str_to_buf(&data, dentry_path, 0);
4035+
save_to_submit_buf(&data, &inode_nr, sizeof(unsigned long), 1);
4036+
save_to_submit_buf(&data, &dev, sizeof(dev_t), 2);
4037+
save_to_submit_buf(&data, &ctime, sizeof(u64), 3);
40084038

40094039
return events_perf_submit(&data, SECURITY_INODE_UNLINK, 0);
40104040
}

pkg/ebpf/c/vmlinux.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,7 @@ struct qstr {
660660
struct dentry {
661661
struct dentry *d_parent;
662662
struct qstr d_name;
663+
struct inode *d_inode;
663664
};
664665

665666
#define MODULE_NAME_LEN (64 - sizeof(unsigned long))

pkg/events/events.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5177,6 +5177,9 @@ var Definitions = eventDefinitions{
51775177
Sets: []string{"default", "lsm_hooks", "fs", "fs_file_ops"},
51785178
Params: []trace.ArgMeta{
51795179
{Type: "const char*", Name: "pathname"},
5180+
{Type: "unsigned long", Name: "inode"},
5181+
{Type: "dev_t", Name: "device"},
5182+
{Type: "u64", Name: "ctime"},
51805183
},
51815184
},
51825185
SecuritySocketCreate: {

0 commit comments

Comments
 (0)