13버전 이후의 오랜만의 보안패치인데

현재 코어에서 문제를 일으키는 부분은 없는 것으로 파악되지만, 상당수의 서드파티 자료가 사용자 입력값을 제대로 검증하지 않고 있는 것으로 보이기 때문에 선제적으로 대응합니다. 기존의 느슨한 동작에 의존하던 서드파티 자료는 이번 패치 후 오작동할 수도 있습니다.

 

우선은 무서워서 실서버에는 반영 못하겠어요 그래도 인젝션 취약점이면 무시못하는 취약점인데 큰일이네요

  • Lv37

    무언가의 정렬 순서를 바꿔서 볼 수 있는 서드파티 자료를 쓰고 계신다면 조심하셔야 합니다. 대표적으로 상품 정렬 순서를 바꿔서 볼 수 있는 누리고 쇼핑몰이 이번 보안패치의 원인이었고, 그 밖에도 주소에 sort_어쩌고, order_저쩌고 하는 변수를 넣을 수 있는 자료라면 한 번쯤 의심해 보세요.

     

    게시판 스킨에서 정렬 순서를 바꾸는 기능은 코어에서 관리하는 부분이므로 안전합니다.

     

    서드파티 자료에서 정렬 순서를 바꿀 수 있도록 지원하더라도, 내부적으로 DocumentModel::getDocumentList() 등 코어에서 제공하는 메소드를 사용한다면 안전합니다.

  • Lv37 Lv8

    XML 쿼리를 이용해서 정렬하는데도 문제가 될까요 ?

    대부분 executeQuery 함수로 쓰는데요

  • Lv8 Lv24
    누리고도 해당 파일및 함수를 호출하였으나 문제가 잇엇습니다 ㅠ
  • Lv8 Lv37
    코어에서 제공하는 기능에는 문제가 없었음에도 불구하고, 긴급 패치를 결정한 이유가
    XML 쿼리를 사용하면 안전하다는 신화(?)가 깨졌기 때문입니다.
  • Lv37 Lv8

    executeQuery 함수를 쓰는데도 문제가 있는거군요 ?

    XML에

     <index var="list_order" default="comments_list.head" order="asc" />
     <index var="list_order" default="comments_list.arrange" order="asc" />

     

    이런식으로 2개씩 들어가는 자료들이 영향 받는걸까요 ?

  • Lv8 Lv37

    그건 상관없습니다.

     

    var에 들어가는 변수에 컬럼명이 아닌 rand() 또는 a + b 같은 식을 넣으면 이제 막힙니다. default에 넣는 것은 괜찮습니다.

  • Lv37 Lv12
    사이트내에 정렬하는 기능있는지 하나씩 살펴봐야겠네요
  • Lv12 Lv19
    일반적인 정렬 기능과 이번 패치는 무관합니다. 조회수와 추천수를 합친 숫자를 기준으로 정렬하는 자료 등 일반적이지 않은 정렬을 사용하는 자료가 있는게 아니라면 대부분 이상이 없을겁니다.
  • Lv37 ? Lv8
    $args->sort_index = "readed_count+voted_count" 이렇게 하면 막힌다는거죠?

    query 문 자체에서 저 합산한 값을 별도 칼럼형태로 AS 로 정의해두고
    그걸 정렬기준으로 삼는건 괜찮은거죠? 하나의 칼럼명이니까..

    그런데 rand() 가 막히는 건 좀 타격인데
    랜덤기능은 거의 전부 $args->sort_index = rand() 인데..

    랜덤추출을 원할때는 그러면 어떻게 해야하나요?
    동일한 쿼리문을 random 전용으로 이름만 다르게 추가로 만들어서 default="rand()" 이렇게 해야하는건가요?
  • ? Lv8 Lv37

    네, <column name="a+b" alias="c" /> 이렇게 별칭으로 처리하거나 <index default="rand()" /> 이렇게 기본값으로 선언하면 문제 없습니다. 이런 문법은 개발자가 하드코딩하는 것이므로, 사용자 입력값에 따라 달라질 수 있는 var="sort_index" 속성과 달리 보안상 위협으로 보지 않습니다.

    가변적으로 사용할 경우 XML 파일을 각각 따로 만들거나, <index default="rand()" if="is_random" /> 이런 조건을 추가해서 $args->is_random 변수가 없을 때는 해당 태그 전체가 무효화되도록 하면 됩니다. (템플릿의 cond와 유사한 기능입니다. table, column, condition도 마찬가지로 if를 사용하여 무효화할 수 있습니다.)

  • Lv37 ? Lv8
    전 어쩔 수 없이 XE 호환도 생각을 해야해서
    <index default="rand()" if="is_random" /> 의 if 문이 Xe 에서는 안 되죠 ^^;;
    결국 쿼리를 두개로 구현해야겠군요 ^^;

    자세한 답변 감사드립니다~
  • ? Lv8 ? Lv3

    @기진곰

    이렇게 한다면 쿼리 2개 만들지 않고도 XE와 Rhymix 둘 다 지원할 수 있지 않을까요?

     

    xml

    <query id="sortIndexTest" action="select">
    <tables>
    <table name="documents" />
    </tables>
    <columns>
    <column name="*" />
    <column name="RAND()" alias="sort_random" />
    <column name="(voted_count + blamed_count)" alias="sort_reputation" />
    </columns>
    <conditions>
    <condition operation="equal" column="status" default="PUBLIC" />
    </conditions>
    <navigation>
    <index var="sort_index" default="list_order" order="order_type" order-default="DESC" />
    </navigation>
    </query>

     

     

    php

    <?php
        $args = new stdClass();
    
        // 랜덤으로 정렬하기
        $args->sort_index = 'sort_random';
        
        // 추천과 비추천 합산하여 정렬하기
        $args->sort_index = 'sort_reputation';
    
        executeQueryArray('test.sortIndexTest', $args);

     

     

  • ? Lv3 Lv37

    가능하긴 하겠지만, 꼭 필요하지 않을 때도 sort_random과 sort_reputation 컬럼이 항상 따라붙고, row마다 랜덤 값을 하나씩 붙여 줘야 하니 불필요한 연산이 발생하겠지요.

    라이믹스에 새 기능을 추가하거나 보안취약점을 패치할 때 어느 정도 하위호환성을 고려하지만, 어디까지나 기존 자료를 라이믹스 최신 버전에서 사용하는 상황을 고려하는 것입니다. 현 시점에서 굳이 XE와 호환되는 자료를 만든다면 작동이 안 되거나 비효율적인 부분이 생길 수밖에 없겠지요.

  • Lv12
    다행히 테스트 서버에서 미리 업데이트 해봤는데 특별한 문제 없는 것 같아 오늘 진행해보려고합니다!
  • Lv12
    전반적으로 제가운영중인 사이트에서는 문제된 경우가 없었네요 패치 감사합니다!!