[질문] passwd명령의 동작원리 ???

cjynim의 이미지

안녕하세요 ... 요즘 리눅스를 공부하다가 SetUID에 대해서 공부를 했습니다.

거기에서 예를 든 명령이 passwd명령인데여 여기에 SetUID가 set 되어있어서 일반 계정의 사용자들이

passwd명령을 통해 root만이 읽을 수 있는 shadow 파일에 접근해서 패스워드를 변경하는 거라고

책에 나와 있더라구여 ~

여기서 제 궁금증이 일기 시작했습니다. shadow파일은 분명이 root도 읽을 수만 있는데 passwd명령에

SetUID를 set하여 일반사용자가 실행하여 root권한으로 명령을 실행한다 해서 어떻게 shadow파일에

비밀번호를 기록할 수 있을까??? 하고 말입니다. 그래서 passwd명령에 SetUID를 unset 한 후 root계정

에서 passwd명령을 실행 시켜 보니 잘 돌아가더라구여 ~ 그래서 이번엔 일반 계정에서 실행 시켜 보니

전혀 실행이 되질 않습니다...

shadow파일 같은 경우 root도 읽기만 가능한데 어떻게 shadow파일의 내용을 passwd명령을 통해서

바꿀수 있는거죠???

lacovnk의 이미지

setuid가 set 되어있으면, effective uid가 사용자가 아니라 바이너리의 소유자가 됩니다.

권한 검사는 effective uid를 기준으로 합니다.

raymundo의 이미지

질문하신 분의 말뜻은... 제가 보기에는, effective uid가 root가 되었다 하더라도, 어쨌거나 /etc/shadow 파일의 퍼미션은 400, r-------- 이고, 'w'가 없는데 어떻게 write가 가능하냐...인 것 같네요. :-)

뭐 passwd 프로그램의 소스를 들여다봐야겠습니다만, 필요하면 중간에 퍼미션을 바꿔서 기록한 후 다시 되돌려놓지 않을까요? root가 무슨 일을 할 때 파일의 퍼미션은 문제가 안 될 거라 생각합니다. 퍼미션을 바꿔버리면 그만이니.

root가 아닌 일반 사용자의 경우도, 자기 소유의 파일이라면 write 퍼미션 없는 건 별 문제가 안 됩니다. 텍스트 파일 하나를 400 퍼미션 주시고,
* vi로 열어서 ("읽기전용"이라고 나옴)
* 수정하고 ("읽기 전용 파일을 고친다"고 경고함)
* :w 로 저장하려면 읽기전용이라면서 안 되지만 (따라서 중요한 파일을 실수로 덮어쓰는 걸 막는 의미는 있겠죠)
* :w! 로 저장하면 됩니다. :-) 사용자가 수작업으로 write 퍼미션 주고, 저장하고, 다시 write 퍼미션을 없애는 과정을 그냥 vi가 알아서 해 주는 거겠거니라고 생각하고 있습니다. (제가 틀렸을 수도 있지만)

좋은 하루 되세요!

cjynim의 이미지

제가 바로 궁금했던 내용입니다 ...

좋은 답변 감사드립니다 . 수고하세여 ~~~~

feanor의 이미지

"root가 아닌 일반 사용자의 경우도, 자기 소유의 파일이라면 write 퍼미션 없는 건 별 문제가 안 됩니다. :w! 로 저장하면 됩니다. :-) 사용자가 수작업으로 write 퍼미션 주고, 저장하고, 다시 write 퍼미션을 없애는 과정을 그냥 vi가 알아서 해 주는 거겠거니라고 생각하고 있습니다."

궁금해서 확인해 봤습니다.

해당 코드는 Vim 7.0의 fileio.c(리비전 1.90) 3709행부터 있습니다.
http://vim.cvs.sourceforge.net/vim/vim7/src/fileio.c?revision=1.90&view=markup#l_3709

#if defined(UNIX) && !defined(ARCHIE)
    /* When using ":w!" and the file was read-only: make it writable */
    if (forceit && perm >= 0 && !(perm & 0200) && st_old.st_uid == getuid()
                             && vim_strchr(p_cpo, CPO_FWRITE) == NULL)
    {
        perm |= 0200;
        (void)mch_setperm(fname, perm);
        made_writable = TRUE;
    }
#endif

한참 내려가서 4245행부터 퍼미션을 되돌려 놓는 코드가 나옵니다.
http://vim.cvs.sourceforge.net/vim/vim7/src/fileio.c?revision=1.90&view=markup#l_4245

#ifdef UNIX
    if (made_writable)
        perm &= ~0200;          /* reset 'w' bit for security reasons */
#endif
    if (perm >= 0)              /* set perm. of new file same as old file */
        (void)mch_setperm(wfname, perm);

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.