рд▓рд┐рдирдХреНрд╕ рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреНрдпреВрд▓ (рдПрд▓рдПрд╕рдПрдо) рдПрдХ рдврд╛рдВрдЪрд╛ рд╣реИ рдЬреЛ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рддрд╛ рд╣реИред рд▓рд┐рдирдХреНрд╕ рд╡рд░реНрдЬрди 2.6 рдХреЗ рдмрд╛рдж рд╕реЗ рдПрд▓рдПрд╕рдПрдо рдХрд░реНрдиреЗрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд░рд╣рд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, SELinux, AppArmor, Tomoyo, рдФрд░ рд╕реНрдореИрдХ рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреНрдпреВрд▓ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдХреЛрд░ рдореЗрдВ "рдирд┐рд╡рд╛рд╕" рдХрд░рддреЗ рд╣реИрдВред
рдореЙрдбреНрдпреВрд▓ "рджреЗрд╢реА" рд▓рд┐рдирдХреНрд╕ рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ - рд╡рд┐рд╡реЗрдХрд╛рдзреАрди рдЕрднрд┐рдЧрдо рдирд┐рдпрдВрддреНрд░рдг (рдбреАрдПрд╕реА)ред LSM рдЪреЗрдХ рдХреЛ DAC рджреНрд╡рд╛рд░рд╛ рдЕрдзрд┐рдХреГрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрд▓рдПрд╕рдПрдо рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рдПрдХреНрд╕реЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдХрд╛ рдЬреЛрдбрд╝ рд╣реИ (рдЬреИрд╕реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SELinux рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рдпреВрдПрд╕рдмреА рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рджреЗрдЧрд╛ред
рдЖрдЗрдП рдЖрд░реЗрдЦ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдПрд▓рдПрд╕рдПрдо рд╣реБрдХ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдУрдкрди рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред

рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдПрд▓рдПрд╕рдПрдо рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХрд░реНрдиреЗрд▓ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреНрдпреВрд▓ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИ (рд╣реБрдХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рдХрд░реНрдиреЗрд▓ рдХреЛрдб рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдХрд░реНрдиреЗрд▓ рдЖрдВрддрд░рд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рдП, рдПрд▓рдПрд╕рдПрдо рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕рддреНрдпрд╛рдкрди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, LSM рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: "рдХреНрдпрд╛ OB рдХреЛрд░ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ S рдПрдХ OP рдХреНрд░рд┐рдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?"
рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рдпрд╣ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдВрдХреЗрдд рдкрд░ рд╣реБрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП sys_call_table рдирд╣реАрдВ рд╣реИред
рдПрдХ рдорд╕реМрджрд╛ рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдХрд░ рд╢реБрд░реВ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред рд╡рд╣ рдмрд╣реБрдд рд╡рд┐рдирдореНрд░ рд╣реЛрдЧрд╛ рдФрд░ рд╣рд░ рдЪреАрдЬ рдореЗрдВ рдбреАрдПрд╕реА рдХреЗ рд╕рд╛рде рд╕рд╣рдордд рд╣реЛрдЧрд╛ред рд╣рдореЗрдВ рдЬрд┐рди рд╕реНрд░реЛрддреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡реЗ рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдмреАрдЪ рд╕реБрд░рдХреНрд╖рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╣реИрдВред
рд╕реНрд░реЛрдд рдЦреЛрджреЛ
рд╣рдо / linux / security.h рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдореЗрд░реЗ рдкрд╛рд╕ рдХрд░реНрдиреЗрд▓ рд╕рдВрд╕реНрдХрд░рдг 2.6.39.4 рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИ)ред рдпрд╣рд╛рдБ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕реБрд░рдХреНрд╖рд╛_ рд╕рдВрд░рдЪрдирд╛ рд╣реИред
рдпрд╣рд╛рдБ рдЗрд╕рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ:
struct security_operations { char name[SECURITY_NAME_MAX + 1]; int (*ptrace_access_check) (struct task_struct *child, unsigned int mode); int (*ptrace_traceme) (struct task_struct *parent); int (*capget) (struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); тАж };
рдпрд╣ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдФрд░ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ рдЬреЛ рдЪреЗрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ 0 рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред рд▓реЗрдХрд┐рди рдХреБрдЫ POSIX рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпреЗ рд╕рд╛рдорд╛рдиреНрдп рдХреНрд╖рдорддрд╛ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рд╣реИрдВ; рдЗрдиреНрд╣реЗрдВ рдлрд╝рд╛рдЗрд▓ рд╕реБрд░рдХреНрд╖рд╛ / commoncap.c рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ / linux / security.c рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ:
int __init register_security(struct security_operations *ops) { if (verify(ops)) { printk(KERN_DEBUG "%s could not verify " "security_operations structure.\n", __func__); return -EINVAL; } if (security_ops != &default_security_ops) return -EAGAIN; security_ops = ops; return 0; }
рдЦрд╛рд▓реА рд▓рд┐рдЦрдирд╛
рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд┐рддрд░рдг рдХрд┐рдЯ рдмреИрдХрдЯреНрд░реИрдХ 5 рдЖрд░ 1 (рдХрд░реНрдиреЗрд▓ рд╕рдВрд╕реНрдХрд░рдг 2.6.39.4) рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SELinux (рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ / рд╕реБрд░рдХреНрд╖рд╛ / selinux /) рдкрд░ рддреИрдпрд╛рд░ рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреНрдпреВрд▓ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рддрдВрддреНрд░ рд╣реБрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВрдиреЗ рдПрдХ рдирдпрд╛ рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдХрдВрдХрд╛рд▓ рдмрдирд╛рдпрд╛ (рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рд╣рдо рдЗрд╕рдореЗрдВ рд╕реЗ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛рдПрдВрдЧреЗ)ред
рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рд░рд╛рдХреНрд╖рд╕реА рд╕реБрд░рдХреНрд╖рд╛_ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рднрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрд▓рд┐рдирдХреНрд╕ рдХреЛ рдЙрдирдХреЗ рдореЙрдбреНрдпреВрд▓ (рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ PtLSM) рдХреЗ рдирд╛рдо рд╕реЗ рдмрджрд▓рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд╣рдо рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд┐рдХрд╛рдпреЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо рд╢реВрдиреНрдп рдХреЛ рдЦрд╛рд▓реА рдХрд░рддреЗ рд╣реИрдВ, int рдХреЛ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд░рд┐рдгрд╛рдо рдПрдХ рдПрд▓рдПрд╕рдПрдо рд╣реИ рдЬреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рджреЗрд╢реА рд░рдХреНрд╖рд╛ рддрдВрддреНрд░ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред (рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб:
pastebin.com/Cst0VVQh )ред
рдереЛрдбрд╝рд╛ рдЙрджрд╛рд╕ рдкреАрдЫреЗ рд╣рдЯрдирд╛ред рд╕рдВрд╕реНрдХрд░рдг 2.6.24 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдХрд░реНрдиреЗрд▓ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ (рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓, LKM) рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╡рд░реНрдгреЛрдВ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, register_security рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдФрд░ рдЙрд╕рдХреЗ рд╣реБрдХ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдирд┐рд░реНрдпрд╛рдд рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдХрд░реНрдиреЗрд▓ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВрдЧреЗред
PtLSM рдореЙрдбреНрдпреВрд▓ рдХреЗ рдирд╛рдо рд╕реЗ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВ: /usr/src/linux-2.6.39.4/security/ptlsm/ред
рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред
1. рдПрдХ Makefile рдмрдирд╛рдПрдБ:
obj-m: = ptlsm.o
2. Kconfig рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
SECURITY_PTLSM рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
рдмреВрд▓ "рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрд░рдХреНрд╖рдг"
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрди
рдорджрдж
рдпрд╣ рдореЙрдбреНрдпреВрд▓ рд╕рдХрд╛рд░рд╛рддреНрдордХ рддрд░рд╣ рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ рдХрд┐ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдХреИрд╕реЗ рджрд┐рдпрд╛ рдЬрд╛рдП, рддреЛ N рдХрд╛ рдЙрддреНрддрд░ рджреЗрдВред
3. рд╣рдо рдПрдбрд┐рдЯ / рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА / рдореЗрдХрдлрд╛рдЗрд▓ рдФрд░ / рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА / рдХреЙрдиреНрдХрдлрд┐рдЧ - рддрд╛рдХрд┐ рдкреВрд░реА рджреБрдирд┐рдпрд╛ рдХреЛ рдирдП рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛред рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдХреА рддрд░рд╣ - рд▓рд╛рдЗрдиреЗрдВ рдЬреЛрдбрд╝реЗрдВред
рдЬреЛрдбрд╝реА рдЧрдИ PtLSM рд╡рд╛рд▓реА рдореЗрд░реА рдлрд╛рдЗрд▓реЗрдВ:
1) рдореЗрдХрдлрд╛рдЗрд▓ -
pastebin.com/k7amsnQK2) рдХреЛрдиреНрдХрдлрд┐рдЧ -
pastebin.com/YDsPBGAzрдЕрдЧрд▓рд╛, рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, рдореЗрдиреБрдХреЛрдирдлрд┐рдЧ рдмрдирд╛рдПрдВ, "рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рдХрд▓реНрдк" рдЖрдЗрдЯрдо рдореЗрдВ PtLSM рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред

рдЕрдм рдмрдирд╛рддреЗ рд╣реИрдВ, рдореЙрдбреНрдпреВрд▓_рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ dmesg рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд▓реЙрдЧ рдХреЛ рдХреНрдпрд╛ рд▓рд┐рдЦрддрд╛ рд╣реИред
рд╕реБрдкрд░ рдХреВрд▓ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдирд╛
рдпрд╣ рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реБрдкрд░ рдХреВрд▓ рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ! рдпрджрд┐ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдХреЛрдИ рдбрд┐рд╡рд╛рдЗрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡реЗрдВрдбрд░ рдЖрдИрдбреА рдФрд░ рдЙрддреНрдкрд╛рдж рдЖрдИрдбреА рд╕реЗ рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХреБрдЫ рднреА рдХрд░рдиреЗ рд╕реЗ рдордирд╛ рдХрд░реЗрдВ (рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпреЗ рдЧреИрд▓реЗрдХреНрд╕реА рдПрд╕ II рдлреЛрди рдЖрдИрдбреА рд╣реЛрдЧреА)ред

рдореИрдВрдиреЗ ptlsm_inode_create рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛, рдЬреЛ рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ "рдЙрдЪреНрдЪ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХрд╛ рдЙрдкрдХрд░рдг" рдорд┐рд▓рд╛ рд╣реИ, рддреЛ рд╡рд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЗрд╕реА рддрд░рд╣ рдХреА рдЬрд╛рдБрдЪ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
static int ptlsm_inode_create(struct inode *dir, struct dentry *dentry, int mask) { if (find_usb_device() != 0) { printk(KERN_ALERT "You shall not pass!\n"); return -EACCES; } else { printk(KERN_ALERT "Found supreme USB device\n"); } return 0; }
рдЕрдм find_usb_device рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рд╡рд╣ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕рднреА рдпреВрдПрд╕рдмреА рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдЧрд╛ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдЖрдИрдбреА рд╡рд╛рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдЧрд╛ред USB рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдбреЗрдЯрд╛ рдЙрди рдкреЗрдбрд╝реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рдирдХреА рдЬрдбрд╝реЗрдВ рд░реВрдЯ рд╣рдм рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╣рд▓рд╛рддреА рд╣реИрдВред рд╕рднреА рдЬрдбрд╝реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА usb_bus_list рдмрд╕ рд╕реВрдЪреА рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред
static int find_usb_device(void) { struct list_head* buslist; struct usb_bus* bus; int retval = -ENODEV; mutex_lock(&usb_bus_list_lock); for (buslist = usb_bus_list.next; buslist != &usb_bus_list; buslist = buslist->next) { bus = container_of(buslist, struct usb_bus, bus_list); retval = match_device(bus->root_hub); if (retval == 0) { break; } } mutex_unlock(&usb_bus_list_lock); return retval; }
рдФрд░ рдЕрдВрдд рдореЗрдВ, match_device рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рд╡реЗрдВрдбрд░ рдЖрдИрдбреА рдФрд░ рдЙрддреНрдкрд╛рдж рдЖрдИрдбреА рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред
static int match_device(struct usb_device* dev) { int retval = -ENODEV; int child; if ((dev->descriptor.idVendor == vendor_id) && (dev->descriptor.idProduct == product_id)) { return 0; } for (child = 0; child < dev->maxchild; ++child) { if (dev->children[child]) { retval = match_device(dev->children[child]); if (retval == 0) { return retval; } } } return retval; }
рдпреВрдПрд╕рдмреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣реЗрдбрд░ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред
#include <linux/usb.h> #include <linux/usb/hcd.h>
рд╣рдо рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЪрд░рдгреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВ - рдФрд░ рдХрдВрдкреНрдпреВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдВрдд рдлреЛрди рдЦрд░реАрджрддреЗ рд╣реИрдВред
