LSM(Linux Security Module) 컴파일 오류

alwaysN00b의 이미지

안녕하세요.

간단하게 아래와 같은 소스로 컴파일 해봤는데 오류가 나네요.. 한참 삽질해봤는데, 제 실력으론 부족해서 질문 올립니다.

코드는 아래와 같고

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/security.h>
 
MODULE_LICENSE("GPL");
 
struct security_operations ops;
int flag;
static int my_rename(struct inode *old_inode, struct dentry *old_dentry,
                    struct inode *new_inode, struct dentry *new_dentry)
{
    return 0;
}
 
static int __init mylsm_init(void)
{
    int flag;
    ops.inode_rename = my_rename;
    flag = register_security(&ops);
    if(flag != 0)
    {
        //error
    }
    return 0;
 
}
 
static void __exit mylsm_exit(void)
{
}
module_init(mylsm_init);
module_exit(mylsm_exit);

오류 메시지는

alwaysn00b@alwaysn00b-VirtualBox:~/modulePrac/security$ make
make -C /usr/src/linux-headers-3.2.0-23-generic-pae SUBDIRS=/home/alwaysn00b/modulePrac/security modules
make[1]: Entering directory `/usr/src/linux-headers-3.2.0-23-generic-pae'
  CC [M]  /home/alwaysn00b/modulePrac/security/norename.o
/home/alwaysn00b/modulePrac/security/norename.c:5:16: error: expected declaration specifiers or ‘...’ before string constant
make[2]: *** [/home/alwaysn00b/modulePrac/security/norename.o] Error 1
make[1]: *** [_module_/home/alwaysn00b/modulePrac/security] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-3.2.0-23-generic-pae'
make: *** [all] Error 2

구글링 해봐도 답이 안나오네요...

답변 부탁드립니다.

bushi의 이미지

MODULE_LICENSE() 가 뭔지 모르답니다.

alwaysN00b의 이미지

먼저 답변 감사드리고, 정말 죄송합니다.
삽질을 많이 했더니... 질문도 정신없어 했군요..

MODULE_LICENSE는 linux/module.h 에 정의되어 있고 include 해서 추가해주었습니다.

실제로 오류가 나는건 아래 문제 때문이었는데,

make -C /usr/src/linux-headers-3.2.0-23-generic-pae SUBDIRS=/home/alwaysn00b/modulePrac/security modules
make[1]: Entering directory `/usr/src/linux-headers-3.2.0-23-generic-pae'
  CC [M]  /home/alwaysn00b/modulePrac/security/norename.o
  Building modules, stage 2.
  MODPOST 1 modules
WARNING: "register_security" [/home/alwaysn00b/modulePrac/security/norename.ko] undefined!
  CC      /home/alwaysn00b/modulePrac/security/norename.mod.o
  LD [M]  /home/alwaysn00b/modulePrac/security/norename.ko
make[1]: Leaving directory `/usr/src/linux-headers-3.2.0-23-generic-pae'

구글링해보니 코드 마지막 줄에 MODULE_LICENSE("GPL")을 추가해 주라고 되어있었습니다.
(마지막에 해주나 처음에 해주나 마찬가지였습니다.)

register_security 는 linux/security.h 에

extern int register_security(struct security_operations *ops);

라고 되어있습니다.

warning이라 그냥 insmod 해보았지만
syslog에

[ 5294.792971] norename: Unknown symbol register_security (err 0)
[ 5481.470451] norename: Unknown symbol register_security (err 0)

이렇게 떨어집니다.

한번더 답변 부탁드립니다.

언제나 시작

alwaysN00b의 이미지

http://selenic.com/pipermail/kernel-mentors/2010-March/000765.html

이런 글이 있네요..

아무래도 커널버전을 낮은걸로 다시 컴파일 해봐야겠습니다.

언제나 시작

bushi의 이미지

그래도 소용없을 겁니다.
register_security() 는 module 에서 호출하지 못합니다.
EXPORT_SYMBOL 되어 있지도 않을 뿐더러 __init 섹션에 있기 때문에 커널 부팅 완료 직후 코드 영역이 없어집니다.

alwaysN00b의 이미지

__init 를 삭제하고 EXPORT_SYMBOL해서 다시 컴파일 해보았습니다.
컴파일때 나던 warning은 없어졌지만, insmod 해보면 마찬가지로
Unknown Symbol 이라는 메시지가 떨어집니다.

제가 뭔가 놓친게 있는것 같은데, 조언 부탁드립니다.

언제나 시작

bushi의 이미지

unknown symbol 의 원인을 알아내서 고쳐봐야 소용없습니다.
__init 섹션에 있는 코드는 그게 그 상황에서만 동작시켜야 하는 함수이기 때문입니다.
뭔가 initialize 하는 계열일 경우, 부팅 완료 이후에 변경(추가/삭제)되면 곤란하거나... 등이죠.

아무튼...
잘 컴파일 되고, 부팅까지 잘 되었다면 /proc/kallsyms 에 그 심볼이 보여야 합니다.
EXPORT_SYMBOL() 이 잘 됐다면 심볼 이름 앞에 '__ksymtab_' 이 붙어 있어야 하고요.

alwaysN00b의 이미지

/proc/kallsyms register_security 가 보이긴 하나 결과는 마찬가지였습니다.
kallsyms 에 __ksymtab_ 은 붙어있는게 없었습니다.

그래서, register_security 주소를 함수포인터로 직접 호출해버리고, insmod 해보았습니다.
일단 모듈은 올라갑니다만... hooking은 제대로 안되는것 같습니다.

조금 더 삽질해 보아야겠습니다.

감사합니다.

언제나 시작

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.