26

답글: 혹시라도 플러그인과 같은 것들이 가질 수 있는 문제

회피할 수 있는 방법을 제공하는 eval(), create_function(), call_user_func(), call_user_func_array(), include, include_once, require, require_once 등을 사용하지 못하게 하면 가능합니다.

27

답글: 혹시라도 플러그인과 같은 것들이 가질 수 있는 문제

PAPACHA 작성:

문제는 의도적으로 악의가 있는 경우입니다. 의도적이기 때문에 체크 루틴을 회피할 수 있는 방법을 사용한다는 것이지요.

말씀하신대로 그 경우는 못 잡죠...
악의는 아니지만 사용자의 동의 없이 DB를 변경한다거나 할 때 경고메세지를 보내주는 정도로 사용하는 정도로 사용할 수 있을 것 같습니다.
(이상적으로는 플러그인을 만들 때 index.xml을 잘 작성해 주시는 쪽이 수고도 없고 좋죠:) )

...daybreaker님 말씀대로 진정 용기있고 시간있는 누군가가 plugin-emulate malfunction checker 같은 것을 만들지 않는 한 악의적 코드 검색은... (거의 인터프리터 자체겠네요. -_-)

PAPACHA 작성:

회피할 수 있는 방법을 제공하는 eval(), create_function(), call_user_func(), call_user_func_array(), include, include_once, require, require_once 등을 사용하지 못하게 하면 가능합니다.

그 경우에는 어떻게 될 수도 있겠습니다.

현재 나온 플러그인중에 위의 기능을 하나라도 사용한 경우가 있는지 아시는 분 계신가요?
플러그인 정도의 기능 구현에는 위의 명령어들은 사실 필요가 거의 없을듯 합니다.

"Everything looks different on the other side."

-Ian Malcomm, from Michael Crichton's 'The Jurassic Park'

28

답글: 혹시라도 플러그인과 같은 것들이 가질 수 있는 문제

현재의 플러그인 제작 방식을 그대로 사용한다면야 악의적인 코드를 찾기란 무리겠죠.
BlogIcon 플러그인을 기준으로 제가 생각하는 대략적인 구상을 말해보겠습니다.

components/Tattertools.Plugins.php 파일

class Plugins {
    var $owner;
    var $database;
    ...
    function tt_empty($v) {
        return empty($v);
    }

    function tt_strlen($v) {
        return strlen($v);
    }
    ...
}

Plugins/BlogIcon/index.php

class BlogIcon extends Plugins {
    var $target;
    var $mother;

    function BlogIcon($target, $mother) {
        $this->__construct($target, $mother);
    }

    function __construct($target, $mother) {
        $this->target = $target;
        $this->mother = $mother;
    }

    function BlogIcon_main() {
        if (Plugins::tt_empty($this->mother['homepage']))
            return $this->target;
        $slash = ($this->mother['homepage']{Plugins::tt_strlen($this->mother['homepage']) - 1} == '/' ? '' : '/');
        return "<img src=\"{$this->mother['homepage']}{$slash}index.gif\" width=\"16\" height=\"16\" onerror=\"this.parentNode.removeChild(this)\"/> $this->target";
    }
}

Plugins/BlogIcon/index.xml

...
    <listener event="ViewCommenter">BlogIcon::BlogIcon_main</listener>
    <listener event="ViewGuestCommenter">BlogIcon::BlogIcon_main</listener>
...

상당히 노가다이긴 하지만..; Plugins class에 사용 가능한 함수들을 일일이 등록시켜주는 거죠.;;
(모듈화된 상태기때문에 개별적으로 업데이트가 이루어지면 되니 큰 문제는 아니라고 생각중)
이렇게되면 validate 시에 Plugins class를 거치지 않는 함수를 잡아내는건 쉽겠죠.
쿼리같은 경우는 아래처럼 대충 처리하고 drop같은건 지원을 안하면 되겠죠.;
(예전에 사용하던 MySQL class 발췌; )

function mysql_select($table, $where, $field = '*') {
    return mysql_query("SELECT ".$field." FROM ".$table." ".$where);
}

헛점이 너무 많은가요? -_-;;

29

답글: 혹시라도 플러그인과 같은 것들이 가질 수 있는 문제

음.. 뭔가 굉장한 논의가 오고갔었군요 ;;
제가 validator에 대한 글을 올릴땐 "플러그인이 위험한지"를 검사한다기보단
"플러그인의 위험 가능성"을 체크하는 의미로 생각했었습니다.
즉, "위험할 수 있다"를 경고하자는거였지요.

생각은 해놓고.. 내용 괜히 길어질까봐 올리지않았던 내용입니다만
user_func나 include등이 발견되면 "외부 코드 호출 발견"
fopen 같은건 "파일 입출력 발견"
exit; 같은것도 그렇고요..

진짜 플러그인이 위험한지를 검증하는걸 만들면.. 그것 자체로도 태터 이상의 프로젝트가 될것 같습니다.

30

답글: 혹시라도 플러그인과 같은 것들이 가질 수 있는 문제

별로 기술적이지 않은 방법으로 접근해보자면..;
지금처럼 제로보드 게시판을 사용하는게 아닌 플러그인 센터 같은걸 만들어서 플러그인은 그쪽에 등록하게 하고
사용자들이 등록된 플러그인에 대해서 평판을 매기는거죠.. 사용자들이 플러그인에 대한 평가를 입력하기 귀찮을 수도 있으니 플러그인이 돌아가고 있는 블로그 갯수, 이 블로그들이 플러그인을 문제없이 사용하고 있는 기간 뭐 이런 것들을 수집해 이용할 수도 있겠구요..
그럼 태터 관리자의 플러그인 화면에서 버튼같은걸 누르면 그 플러그인에 대한 평판, 플러그인을 사용중인 블로그 수, 사용자 코멘트같은걸 보여줘서 판단하게 하고 새로 올라와서 정보가 없거나 플러그인 센터가 아닌 곳에서 배포된 플러그인이라면 '이 플러그인은 검증되지 않았으니 블로그 날아가도 난몰라 욜렐랄루~~' 하고 메세지를 보여줄 수도 있겠고.. 이렇게 되면 플러그인 원격 업데이트 같은 것도 가능하겠네요..

음.. 그냥 index.php 체크하는게 더 쉬울려나요?;

31

답글: 혹시라도 플러그인과 같은 것들이 가질 수 있는 문제

Peris 작성:

현재의 플러그인 제작 방식을 그대로 사용한다면야 악의적인 코드를 찾기란 무리겠죠.
BlogIcon 플러그인을 기준으로 제가 생각하는 대략적인 구상을 말해보겠습니다.

components/Tattertools.Plugins.php 파일

class Plugins {
    var $owner;
    var $database;
    ...
    function tt_empty($v) {
        return empty($v);
    }

    function tt_strlen($v) {
        return strlen($v);
    }
    ...
}

Plugins/BlogIcon/index.php

class BlogIcon extends Plugins {
    var $target;
    var $mother;

    function BlogIcon($target, $mother) {
        $this->__construct($target, $mother);
    }

    function __construct($target, $mother) {
        $this->target = $target;
        $this->mother = $mother;
    }

    function BlogIcon_main() {
        if (Plugins::tt_empty($this->mother['homepage']))
            return $this->target;
        $slash = ($this->mother['homepage']{Plugins::tt_strlen($this->mother['homepage']) - 1} == '/' ? '' : '/');
        return "<img src=\"{$this->mother['homepage']}{$slash}index.gif\" width=\"16\" height=\"16\" onerror=\"this.parentNode.removeChild(this)\"/> $this->target";
    }
}

Plugins/BlogIcon/index.xml

...
    <listener event="ViewCommenter">BlogIcon::BlogIcon_main</listener>
    <listener event="ViewGuestCommenter">BlogIcon::BlogIcon_main</listener>
...

상당히 노가다이긴 하지만..; Plugins class에 사용 가능한 함수들을 일일이 등록시켜주는 거죠.;;
(모듈화된 상태기때문에 개별적으로 업데이트가 이루어지면 되니 큰 문제는 아니라고 생각중)
이렇게되면 validate 시에 Plugins class를 거치지 않는 함수를 잡아내는건 쉽겠죠.
쿼리같은 경우는 아래처럼 대충 처리하고 drop같은건 지원을 안하면 되겠죠.;
(예전에 사용하던 MySQL class 발췌; )

function mysql_select($table, $where, $field = '*') {
    return mysql_query("SELECT ".$field." FROM ".$table." ".$where);
}

헛점이 너무 많은가요? -_-;;

이것은 인터페이스만을 제한하는 것으로, 앞서 논의된 문제 해결과 관련이 없습니다.
이렇게 하면 플러그인 개발이 더 힘들어지기 때문에 지금의 간단한 구조를 채택한 것입니다.

32

답글: 혹시라도 플러그인과 같은 것들이 가질 수 있는 문제

관리하기 쉽게 인터페이스를 갖추는 것도 하나의 방법입니다.

표준적인 인터페이스를 통해서 플러그인의 개발자가 직접 위험 수위나 디테일한 내용을 (여기서는 DB의 수정 정도 되겠네요.) 표기하는 방법을 제시하고 사용자가 확인할 수 있게 하는 것입니다. 세부적인 방법은 여러가지가 있겠습니다만 한 가지 방법은 주석이 무조건 일정한 형태를 취하도록 하는 것입니다. 형태에 적합할 때 주석의 내용을 유저에게 표기해 주게 하고 적합하지 않을 때는 플러그인은 자동 deactivate되면 될 것입니다.

관리자는 개발자가 표기한 위험수위와 디테일한 내용을 확인하고 그것이 사실과 동일할 때만 플러그인을 공개합니다. 더 나아가 확장 등록자에 대해서 화이트 리스트나 블랙 리스트를 관리할 수도 있겠지요.

이 방법은 몇가지 이점이 있습니다.

1. 개발자가 제시한 정보가 관리자의 체크리스트가 된다.
2. 개발자가 어느정도 보안에 대해 책임을 느끼게 된다.
3. 항목과 다를 때 유저나 관리자가 따질 근거가 된다.

33

답글: 혹시라도 플러그인과 같은 것들이 가질 수 있는 문제

CN 작성:

관리하기 쉽게 인터페이스를 갖추는 것도 하나의 방법입니다.

표준적인 인터페이스를 통해서 플러그인의 개발자가 직접 위험 수위나 디테일한 내용을 (여기서는 DB의 수정 정도 되겠네요.) 표기하는 방법을 제시하고 사용자가 확인할 수 있게 하는 것입니다. 세부적인 방법은 여러가지가 있겠습니다만 한 가지 방법은 주석이 무조건 일정한 형태를 취하도록 하는 것입니다. 형태에 적합할 때 주석의 내용을 유저에게 표기해 주게 하고 적합하지 않을 때는 플러그인은 자동 deactivate되면 될 것입니다.

관리자는 개발자가 표기한 위험수위와 디테일한 내용을 확인하고 그것이 사실과 동일할 때만 플러그인을 공개합니다. 더 나아가 확장 등록자에 대해서 화이트 리스트나 블랙 리스트를 관리할 수도 있겠지요.

이 방법은 몇가지 이점이 있습니다.

1. 개발자가 제시한 정보가 관리자의 체크리스트가 된다.
2. 개발자가 어느정도 보안에 대해 책임을 느끼게 된다.
3. 항목과 다를 때 유저나 관리자가 따질 근거가 된다.

지금 구현된 형태가 그러한 형태입니다. smile index.xml에 이 플러그인의 동작 범위에 대하여 적도록 되어 있습니다.

문제는 제작자 분들이 저 목록을 항상 형식에 맞게 적어주시지 않는다는 점이죠. 결국 말씀하신대로 플러그인을 설치하는 관리자분들이 직접 체크를 하시거나, 아니면 플러그인이 올라오면 보안에 관련된 내용을 체크하는 팀을 만들거나 해야 할 것 같습니다.

"Everything looks different on the other side."

-Ian Malcomm, from Michael Crichton's 'The Jurassic Park'

34

답글: 혹시라도 플러그인과 같은 것들이 가질 수 있는 문제

플러그인을 TNF/TNC에서 검증하여 안전하다고 확인이 되면 일종의 인증 마크를 달고 배포할 수 있도록 하는 것도 좋을 것 같습니다. 현재의 제로보드 게시판 형식으로 된 플러그인 게시판을 좀더 뽀대(-_-)나게 바꾸어서(Firefox 플러그인 사이트 정도만 되어도 괜찮을 듯..;; ) 개발자들이 거기에 자신의 플러그인이 인증된 채 배포되는 걸 자랑스럽게 여기도록 유도(..)하는 것도 좋을 것 같습니다.

문제의 답은 우리 안에 있다.
내면에 귀를 기울여 보자.

35

답글: 혹시라도 플러그인과 같은 것들이 가질 수 있는 문제

daybreaker 작성:

플러그인을 TNF/TNC에서 검증하여 안전하다고 확인이 되면 일종의 인증 마크를 달고 배포할 수 있도록 하는 것도 좋을 것 같습니다. 현재의 제로보드 게시판 형식으로 된 플러그인 게시판을 좀더 뽀대(-_-)나게 바꾸어서(Firefox 플러그인 사이트 정도만 되어도 괜찮을 듯..;; ) 개발자들이 거기에 자신의 플러그인이 인증된 채 배포되는 걸 자랑스럽게 여기도록 유도(..)하는 것도 좋을 것 같습니다.

검증작업에 대한 TNF/TNC의 업무부하가 눈에 보입니다.. smile 농담이구요..

제작한 플러그인을 자유롭게 올릴 수 있는 현 체계와 검증작업을 도입한 인증체계 사이의 장단점에 대해
TNF에서 한번 논의를 해보면 어떨까 싶군요..

위 글들을 읽고 몇가지 생각해 본 배포체계를 적어봅니다..

1. 플러그인 인증체계 도입
- 개발자가 제작한 플러그인에 대해 TNF나 TNC에 인증요청을 한 후 인증이 완료되면 플러그인 게시판(사이트)에
   올려짐.. 인증이 안된 플러그인에 대해서는 내용조회만 가능..
   외부 업체들 중에서도 플러그인 인증 요청을 한 후 정식적으로 인증된 후에 배포되는 사례들이 있습니다..

2. 현행 플러그인 배포체계 + 인증체계
  - 현 체계처럼 자유롭게 제작한 플러그인을 배포할 수 있도록 합니다.. 대신 인증체계를 믹스하여 TNF/TNC에 의해
    공식적으로 인증된 플러그인에 대해서는 인증마크를 부여하여 사용자에게 플러그인의 사용에 대한 선택권한을
    넘겨줍니다..

3. 현행 플러그인 배포체계 + 사용자 레벨제 도입
  - 현행 플러그인 배포체계에 실재 플러그인을 사용해 본 유저들에 의한 평가체계(별점제 등)를 도입하여
    플러그인에 대한 안정성을 사용자들에게 판단하도록 합니다.. TNF/TNC의 업무부하를 줄일 수 있는 장점이
    있습니다.. 대신 악의적인 의도로 작성된 플러그인에 대해 사전 제약을 줄 수 없는 단점이 존재합니다..

4. 플러그인 제작자 인증체계
  - 플러그인의 제작자들에 대한 인증체계를 도입하여(오픈마켓의 셀러들에 대한 등급제같은..) 공식적으로
    인증이 된 제작자들의 플러그인은 안심하고 받아서 설치할 수 있는 체계를 도입합니다.. 인증된 제작자의
    선정에 대한 기준이 먼저 마련되어야 하고 제작자 역시 본인이 개발하여 배포하는 플러그인에 대한 책임을
    질 수 있는 환경이 조성되어야 하겠죠..

일단 플러그인을 검증하는 기술적인 내용에 대해서는 TNF 전문가분들에게 떠 넘기고.. smile 머리속에서
생각나는대로 한번 적어봤습니다..

후회가 꿈을 대신하는 순간부터 우리는 늙기 시작한다..

36

답글: 혹시라도 플러그인과 같은 것들이 가질 수 있는 문제

맥퓨처님이 제안하신 체계중 2,4번이 마음에 드네요 wink

개별 플러그인에 대해서 TnF certificated plugin 으로 안정성이나 보안, 버전 적합성등의 검증을 거쳐 인증을 부여하고 더불어 일종의 TnF partner 형태로 특정 제작자 그 자체의 신뢰도를 인정하여 그로부터 나오는 플러그인에 파트너 인증을 부여하는 편이 괜찮다 봅니다. 이러한 인증작업을 얼마전에 제기된 TnF 체계화와 더불어 TnF 의 역할의 하나로 자리잡아도 괜찮겠지요.

TnC 는 platform 으로서의 TT 개발에 집중하고, 플러그인이나 스킨등 application 의 측면은 TnF 가 맡는다면 업무의 무게도 어느정도 분할이 되겠지요.

37

답글: 혹시라도 플러그인과 같은 것들이 가질 수 있는 문제

뉴클리어스의 경우는 플러그인이 개발되면 우선 T&F와 같은 플러그인 포럼에 공개하게 됩니다. 그럼 포럼 이용자들이 이 플러그인을 사용해보고 문제점도 지적하는등 검증 절차를 거칩니다. 이 절차이후에 플러그인이 공식플러그인 페이지에 공개됩니다.

물론 뉴클리어스의 경우 플러그인도 GPL이 적용돼서 누구나 기존의 플러그인을 이용해서 자신에게 맞거나 필요로 하는 플러그인을 제작합니다. 또 개발이 중단되면 다른 사람이 이걸 이어받아서 계속 개발하거나 새로운 플러그인이 기존의 플러그인을 대체하기도 하고요.

태터도 이런 자연스러운 검증절차를 두면 좋겠습니다.

38

답글: 혹시라도 플러그인과 같은 것들이 가질 수 있는 문제

코드안에 플러그인 검증 루틴을 넣는다면 여러가지 제약이 심해져서 다양한 플러그인이 나오기만 어려워지는건 아닌가
하는 우려가 들면서도... 또, 그렇게 안하는 경우에는 플러그인 검증을 거치는 것이 좋을 것 같다는 생각이 들면서도...
이런 생각들도 듭니다...

사실 태터툴즈 공식 홈피에 플러그인을 제작하여 올리시는 분들 중에
그런 악의를 가지고 공개하실 분은 거의 없겠죠... 소스까지 다 공개되는데
오픈소스 특성상 악의를 가지고 무언가를 공개하시는 분들은 극소수일거란 생각이 듭니다.

정말로 문제되는 것은 진정한 악인으로서의 의도를 가지고 공식 홈페이지가 아닌 곳에서
비공개로 배포하는 것이죠...  마치 와레즈에서 비공식으로 크랙에 바이러스를 묻히는 것처럼요... ^^;

이런 바이러스에 감염되는 건 사실상 사용자의 책임이 크다고 봅니다.

그런데 또 설치형 블로그를 사용하시는 분들 중에서는 이정도는 가려서 쓰실 능력이 충분하시다고 생각을 합니다.
그렇지 않은 분들은 Tistory 나 이노리, 오마이뉴스 블로그를 사용하지 않을까요...
당연히 서비스형 태터툴즈에서 제공되는 플러그인들은 기본적으로 검수를 거친 플러그인 들일테니까요. ^^;

하여간 참 어려운 문제네요... smile

kebie (2006-05-28 13:41:11)에 의해 마지막으로 수정

39

답글: 혹시라도 플러그인과 같은 것들이 가질 수 있는 문제

JWC 작성:

저도 가장 불안히 생각하는 것중 한가지 입니다.
어떤 플러그인을 다운 받아서 설치했는데 DB에 테이블을 생성하는걸 보고 겁이나더군요.
이거 악용만하면 데이터도 마음대로 수정하거나 파괴할 수 있겠구나 하고요.

DB modify 명령이 플러그인 자체에서 동작하는 방식은 옳지 않은 것 같습니다. 만약 DB modify가 필요하다면 해당 계정의 소유자가 DB 변경에 대하여  이해한 상태에서 "직접" 변경해야 겠지요.  그런데, 테이블 생성구문까지 허용되고 있는 것은 몰랐네요.. ^^;;

40

답글: 혹시라도 플러그인과 같은 것들이 가질 수 있는 문제

플러그인 제작시 왠만하면 DB create/modify는 피해야하겠지만 원하는 기능을 표현하려고 하다보니
피치못해 넣는것 같습니다. 저 또한 몇개의 플러그인에 DB create를 했었지만 크게 문제가 될것은 없으리라 봅니다.
위에서 검증부분에 대해 많은 언급이 있었는데, 당연히 있어야 한다고 봅니다. 현재 1.0코어의 초기 단계지만
점점 더 많은 플러그인들이 쏟아져 나올것입니다. 이에 대한 검증 체계를 안잡아 준다면 당연히 난잡해지리라 생각합니다.
맥퓨처님께서 언급해주신 검증체계처럼 여러각도에서 검증할수 있도록 자리잡아야 할것입니다.
그러나, 인증 절차에서 무조건적 자름은 없어야 될것 같구요. 한 블로거가 정말 좋은 플러그인을 선보였는데
인증에 적합하지 않다고 등록을 안시켜준다면 조금은 안좋게 생각하겠죠. 그에 대한 뭐랄까 플러그인 등급체제를
두어 '안심/보통/낮음' 이런식으로 해주는 것도 좋을것이구요. 진짜 악성 플러그인이라면 제작자에게 일종의 주의성
메세지(메일/쪽지)등을 보낼수 있으면 좋겠구요. 또한 부족한 플러그인에 대해서는 서포터를 하여 모두들 사용할수
있게 해주는것두 좋을것 같습니다. 물론 위에서 모두 언급한 내용이지만요~~
daybreaker님 께서 말씀하신것처럼 플러그인 등록 게시판 또한 레이아웃이 변경되어야 할듯합니다.
추후 검증 체계가 잡힌 다음이겠죠.
------------------------------------------------------------------------------------------------------------------
번호 |       제목      | 사용가능브라우져 | 인증상태 | 제작자 | 날짜 | 추천 | 힛트
------------------------------------------------------------------------------------------------------------------
123 플러그인플러그인플러그인   ⓘ ⓕ ⓞ     ⓨ   아무개   05/29 5  5
------------------------------------------------------------------------------------------------------------------

위와같은 레이아웃으로 아이콘화 하여 표시해주면 플러그인을 사용하고자하는 블로거님들께서 한눈에 보기
좋을것 같습니다.

위에서 언급한 내용을 다시금 얘기한것 같습니다. 1.0.6버젼이후 더 확고한 문제들이 언급될것으로 보입니다.

TnF님분들 좋은 저녁시간 되세요.:cool:

당신의 삶속에 매화꽃 향기처럼 늘 아름다운 향기로 가득하길...
# J.Parker

41

답글: 혹시라도 플러그인과 같은 것들이 가질 수 있는 문제

플러그인 인증체계에 대해서는 지난번 TnF 모임에서도 논의가 되었습니다..(그만큼 이슈라는.. 후후)

회의록 참고 : http://www.tattertools.com/ko/forum/vie … php?id=447

이 의견이 최종 fix된 것은 아닙니다.. TnF 님들의 다양한 의견들이 최종적으로 합리적인 인증체계를
만들어 낼 수 있을 것 같네요.. 그런 의미에서 의견들 팍!팍! 주세요.. smile

후회가 꿈을 대신하는 순간부터 우리는 늙기 시작한다..

42

답글: 혹시라도 플러그인과 같은 것들이 가질 수 있는 문제

가장 문제는 보안 위협이겠고 다른 하나는 새로운 버전의 태터툴즈가 배포되었을 때 이전 버전에서의 마이그레이션이 지원이 안되는 경우가 될 것 같네요.  이용자가 많다면 "Don't worry. Be Happy!!" ^^

이 두가지 문제는 확실히 알려야 할 것 같은데 "알림"과 "경고"는 제 경험상 어지간히 알려서도 잘 안먹히더군요.

"완전환상 플러그인"이 많이 많이 나오기를 기대합니다. ^^