by Anonymous » 21 May 2025, 11:48
Ich schreibe ein EBPF -Programm (Linux Security Modul) mit dem Hook LSM.S/Inode_Rename , und
ich möchte den vollständigen Pfad der umbenannten Datei oder des Verzeichnisses erfassen. Ich verwende die Toolchain von Co-RE und Cilium. Laufzeitfehler wie: < /p>
Code: Select all
load program: invalid argument: value -2147483648 makes ringbuf_mem pointer be out of bounds
< /code>
Was ich ausprobiert habe: Ich habe das Problem vereinfacht, indem ich nur die Dateinamen in umgekehrter Pfadreihenfolge in einen preallozierten Zeichenpuffer angehängt habe, wie unten. (Angenommen, es gibt einen Pfad /home/knights/run.sh
. Dann habe ich die Zahnstapelknoten wie run.sh -> Ritter -> home -> null durchqueren. run.sh/knights/home/.)
Code: Select all
static __always_inline int build_path(struct dentry *d, char *buf, int buf_len) {
int off = 0;
#pragma unroll
for (int i = 0; i < 16; i++) {
if (!d) break;
struct qstr q = BPF_CORE_READ(d, d_name);
__u32 len = q.len;
if (off + len + 2 > buf_len) // name + slash + NULL
return -1;
// Copy name into buffer
bpf_probe_read_kernel(buf + off, len, q.name);
off += len;
// Append slash
buf[off++] = '/';
struct dentry *parent = BPF_CORE_READ(d, d_parent);
if (parent == d) break;
d = parent;
}
if (off >= buf_len)
return -1;
buf[off] = '\0';
return off;
}
Ich erhalte jedoch immer noch Abstürze oder Verifiziererableitungen, wenn ich diesen Code unter realer Weltnutzung ausführe (z. B. mv Befehl in ubuntu linux). Ich könnte den Dateinamen nur erfolgreich erhalten (z. B. run.sh Wenn der gesamte Pfad /home/knight/run.sh ist). Sie finden den gesamten Code meines aktuellen Fortschritts unter:
https://github.com/knightchaser/lsm-bpf ... ode_rename Pfad sicher in EBPF, vermeiden Sie Überprüfungsfehler oder ungültige Speicherzugriff?
Ich schreibe ein EBPF -Programm (Linux Security Modul) mit dem Hook LSM.S/Inode_Rename , und [url=viewtopic.php?t=14917]ich möchte[/url] den vollständigen Pfad der umbenannten Datei oder des Verzeichnisses erfassen. Ich verwende die Toolchain von Co-RE und Cilium. Laufzeitfehler wie: < /p>
[code]load program: invalid argument: value -2147483648 makes ringbuf_mem pointer be out of bounds
< /code>
Was ich ausprobiert habe: Ich habe das Problem vereinfacht, indem ich nur die Dateinamen in umgekehrter Pfadreihenfolge in einen preallozierten Zeichenpuffer angehängt habe, wie unten. (Angenommen, es gibt einen Pfad /home/knights/run.sh [/code]. Dann habe ich die Zahnstapelknoten wie run.sh -> Ritter -> home -> null durchqueren. run.sh/knights/home/.)
[code]static __always_inline int build_path(struct dentry *d, char *buf, int buf_len) {
int off = 0;
#pragma unroll
for (int i = 0; i < 16; i++) {
if (!d) break;
struct qstr q = BPF_CORE_READ(d, d_name);
__u32 len = q.len;
if (off + len + 2 > buf_len) // name + slash + NULL
return -1;
// Copy name into buffer
bpf_probe_read_kernel(buf + off, len, q.name);
off += len;
// Append slash
buf[off++] = '/';
struct dentry *parent = BPF_CORE_READ(d, d_parent);
if (parent == d) break;
d = parent;
}
if (off >= buf_len)
return -1;
buf[off] = '\0';
return off;
}
[/code]
Ich erhalte jedoch immer noch Abstürze oder Verifiziererableitungen, wenn ich diesen Code unter realer Weltnutzung ausführe (z. B. mv Befehl in ubuntu linux). Ich könnte den Dateinamen nur erfolgreich erhalten (z. B. run.sh Wenn der gesamte Pfad /home/knight/run.sh ist). Sie finden den gesamten Code meines aktuellen Fortschritts unter: https://github.com/knightchaser/lsm-bpf-capture-path-cilium/blob/feat/1/bpf/capture_inode_rename Pfad sicher in EBPF, vermeiden Sie Überprüfungsfehler oder ungültige Speicherzugriff?