4.36.02 (2012.06.27)
: 플래시의 액션스크립트와 자바스크립트의 연동을 차단하여 악의적인 사이트로의 이동을 막는다. (i2sec 김준규님께서 알려 주셨습니다.)
value="always" 를 value="never" 로, allowScriptaccess="always" 를 allowScriptaccess="never" 로 변환하는데 목적이 있다.
: 4.36.01 의 코드에 오류가 있어 수정했습니다.
lib/common.lib.php 의 아래 코드를 수정 및 추가하십시오.
$content = preg_replace_callback("#<([^>]+)#", create_function('$m', 'return "<".str_replace("<", "<", $m[1]);'), $content);
$content = preg_replace("/\<(\w|\s|\?)*(xml)/i", "", $content);
// 플래시의 액션스크립트와 자바스크립트의 연동을 차단하여 악의적인 사이트로의 이동을 막는다.
// value="always" 를 value="never" 로, allowScriptaccess="always" 를 allowScriptaccess="never" 로 변환하는데 목적이 있다.
$content = preg_replace("/((?<=\]+)(\s*=\s*[\'\"]?)always([\'\"]?)([^>]+(?=\>))/i", "$1$2never$3$4", $content);
4.36.01 (2012.06.26)
: XSS 취약점 수정 보완 (i2sec 강우석님께서 원인과 해결책을 모두 알려 주셨습니다.)
기존코드에 헛점이 있어 코드를 수정 보완 하였습니다.
lib/common.lib.php 의 conv_content() 함수에 아래와 같이 한줄 추가 하였습니다.
$content = preg_replace_callback("#<([^>]+)#", create_function('$m', 'return "<".htmlspecialchars($m[1], ENT_NOQUOTES);'), $content);
4.36.00 (2012.06.21)
: DB SESSION 의 MySQL 과부하로 인하여 기존의 FILE SESSION 으로 되돌림
data/session 디렉토리를 생성하신 후
chmod 777 data/session 명령으로 세션데이터 쓰기가 가능하도록 퍼미션을 변경하시기 바랍니다.
data/session 디렉토리에 deny from all 과 같은 내용으로 .htaccess 파일을 생성하십시오.
common.php 를 아래와 같이 수정하십시오.
//-------------------------------------------
// SESSION 설정
//-------------------------------------------
ini_set("session.use_trans_sid", 0); // PHPSESSID를 자동으로 넘기지 않음
ini_set("url_rewriter.tags",""); // 링크에 PHPSESSID가 따라다니는것을 무력화함 (해뜰녘님께서 알려주셨습니다.)
session_save_path("{$g4['path']}/data/session");
if (isset($SESSION_CACHE_LIMITER))
@session_cache_limiter($SESSION_CACHE_LIMITER);
else
@session_cache_limiter("no-cache, must-revalidate");
//==============================================================================
// 공용 변수
//==============================================================================
// 기본환경설정
// 기본적으로 사용하는 필드만 얻은 후 상황에 따라 필드를 추가로 얻음
$config = sql_fetch(" select * from $g4[config_table] ");
ini_set("session.cache_expire", 180); // 세션 캐쉬 보관시간 (분)
ini_set("session.gc_maxlifetime", 10800); // session data의 garbage collection 존재 기간을 지정 (초)
ini_set("session.gc_probability", 1); // session.gc_probability는 session.gc_divisor와 연계하여 gc(쓰레기 수거) 루틴의 시작 확률을 관리합니다. 기본값은 1입니다. 자세한 내용은 session.gc_divisor를 참고하십시오.
ini_set("session.gc_divisor", 100); // session.gc_divisor는 session.gc_probability와 결합하여 각 세션 초기화 시에 gc(쓰레기 수거) 프로세스를 시작할 확률을 정의합니다. 확률은 gc_probability/gc_divisor를 사용하여 계산합니다. 즉, 1/100은 각 요청시에 GC 프로세스를 시작할 확률이 1%입니다. session.gc_divisor의 기본값은 100입니다.
session_set_cookie_params(0, "/");
ini_set("session.cookie_domain", $g4['cookie_domain']);
@session_start();
4.35.02 (2012.06.15)
: 4.35.01 의 세션테이블 생성할때 utf-8 사용시 세션테이블을 utf8 로 생성 (내일을위하여 님이 알려주시고 모바일님이 해결해 주셨습니다.)
lib/dbsession.lib.php 에 추가하세요.
if (strtolower($g4['charset']) == 'utf-8') {
$sql .= " DEFAULT CHARSET=utf8 ";
}
4.35.01 (2012.06.13)
: 4.35.00 에서 cookie_domain 의 설정등이 누락되어 서브도메인간의 세션 공유가 되지 않던 오류를 수정 (cosy님께서 알려주셨습니다.)
: 세션 데이터의 유지시간이 기본 1440초(24분)으로 짧아 10800초(3시간) 동안 유지되도록 수정
: 세션 테이블 생성시 날짜시간에 인덱스를 추가
common.php 를 아래와 같이 수정하세요.
//-------------------------------------------
// SESSION 설정
//-------------------------------------------
include_once("$g4[path]/lib/dbsession.lib.php");
$session = new g4_dbsession();
session_set_save_handler(array($session, 'open'),
array($session, 'close'),
array($session, 'read'),
array($session, 'write'),
array($session, 'destroy'),
array($session, 'gc'));
session_set_cookie_params(0, "/");
ini_set("session.cookie_domain", $g4['cookie_domain']);
ini_set("session.cache_expire", 180); // 세션 캐쉬 보관시간 (분) 180분 == 3시간
ini_set("session.gc_maxlifetime", 10800); // session data의 garbage collection 존재 기간을 지정 (초) 10800초 == 3시간
ini_set("session.use_trans_sid", 0); // PHPSESSID를 자동으로 넘기지 않음
ini_set("url_rewriter.tags",""); // 링크에 PHPSESSID가 따라다니는것을 무력화함 (해뜰녘님께서 알려주셨습니다.)
if (isset($SESSION_CACHE_LIMITER))
@session_cache_limiter($SESSION_CACHE_LIMITER);
else
@session_cache_limiter("no-cache, must-revalidate");
@session_start();
//-------------------------------------------
lib/dbsession.lib.php 를 아래와 같이 수정하세요.
$sql = " CREATE TABLE `$g4[session_table]` (`ss_id` CHAR(32) NOT NULL, `ss_data` TEXT NOT NULL, `ss_datetime` DATETIME NOT NULL, PRIMARY KEY (`ss_id`), KEY `ss_datetime` (`ss_datetime`)) ENGINE = MYISAM ";
4.35.00 (2012.06.12)
: SESSION Data 가 노출되지 않도록 DB SESSION 사용 (HSEngine 님께서 알려 주셨습니다.)
: $_SERVER['PHP_SELF'] 변수를 사용한 XSS 취약점 수정
lib/dbsession.lib.php 파일 추가
config.php 파일에 추가하세요.
$g4['session_table'] = $g4['table_prefix'] . "session"; // 세션 테이블
common.php 파일에서
SESSION 관련 코드를 모두 삭제하신 후 아래 코드로 대체하세요.
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
$_SERVER['PHP_SELF'] = htmlentities($_SERVER['PHP_SELF']);
//-------------------------------------------
// SESSION 설정
//-------------------------------------------
include_once("$g4[path]/lib/dbsession.lib.php");
$session = new g4_dbsession();
session_set_save_handler(array($session, 'open'),
array($session, 'close'),
array($session, 'read'),
array($session, 'write'),
array($session, 'destroy'),
array($session, 'gc'));
ini_set("session.use_trans_sid", 0); // PHPSESSID를 자동으로 넘기지 않음
ini_set("url_rewriter.tags",""); // 링크에 PHPSESSID가 따라다니는것을 무력화함 (해뜰녘님께서 알려주셨습니다.)
if (isset($SESSION_CACHE_LIMITER))
@session_cache_limiter($SESSION_CACHE_LIMITER);
else
@session_cache_limiter("no-cache, must-revalidate");
@session_start();
//-------------------------------------------
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
4.34.30 (2012.05.29)
: 4.34.28 의 검색 구문 수정후 게시판에서 분류 검색이 되지 않는것을 수정
lib/common.lib.php 의 get_sql_search() 함수가 수정 되었습니다.
4.34.29 (2012.05.27)
: 4.34.28 패치에서 embed 태그중 allowscriptaccess 코드를 script 로 인식하여 동영상 작동이 안되는것을 수정
lib/common.lib.php 의 bad120422() 함수가 수정 되었습니다.
function bad120422($matches)
{
$tag = $matches[1];
$code = $matches[2];
if (preg_match("#\bscript\b#i", $code)) {
return "$tag 태그에 스크립트는 사용 불가합니다.";
} else if (preg_match("#\bbase64\b#i", $code)) {
return "$tag 태그에 BASE64는 사용 불가합니다.";
}
return $matches[0];
}
4.34.28 (2012.05.24)
: 게시판 검색시 검색어에 태그가 들어가는 경우 쿼리 에러가 나는것을 수정 (곱슬최씨님께서 알려 주셨습니다.)
get_sql_search() 함수 수정
: [보안패치] XSS 취약점 오류 수정 (i2sec 하동민님께서 알려 주셨습니다.)
conv_content(), bad120422() 함수 수정
lib/common.lib.php
4.34.27 (2012.05.22)
: [보안패치] SQL Injection 공격 취약점을, 김동현(BlackFalcon)님께서 한국인터넷진흥원을 통하여 알려 주셨습니다.
bbs/download.php 에 아래 코드를 한줄 추가해 주시기 바랍니다.
$no = (int)$no;
4.34.26 (2012.05.03)
: 4.34.23 에서 이상 없는 OBJECT 태그의 반환이 제대로 되지 않던 오류 수정 (곱슬최씨님께서 고쳐 주셨습니다.)
lib/common.lib.php 의
function bad120422($matches)
{
$code = $matches[1];
if (preg_match("#script#i", $code)) {
return "OBJECT 태그에 스크립트는 사용 불가합니다.";
} else if (preg_match("#base64#i", $code)) {
return "OBJECT 태그에 BASE64는 사용 불가합니다.";
}
return $matches[0]; // 이 코드가 추가 되었습니다.
}
4.34.25 (2012.04.30)
: [보안강화] 설치시 data 디렉토리에 .htaccess 파일을 생성하여 data 디렉토리 및 하위 디렉토리에서는
.htaccess .htpasswd .php .phtml .html .htm .inc .cgi .pl 파일을 실행 할 수 없습니다.
기존에 운영중인 사이트에서는 data 디렉토리에 .htaccess 파일을 아래와 같은 내용으로 작성하십시오.
Order allow,deny
Deny from all
4.34.24 (2012.04.23)
: 4.34.23의 conv_content() 함수내에 함수가 선언되어 그누보드외 프로그램에서 오류가 발생했습니다.
bad120422() 함수를 conv_content() 바깥으로 이동시켜 해결하였습니다. (지니아빠님께서 알려 주셨습니다.)
lib/common.lib.php
4.34.23 (2012.04.22)
: [XSS] OBJECT 태그에서 javascript를 실행할수 있는 버그를 수정 (i2Sec 8기 하동민님께서 알려 주셨습니다.)
: [XSS] 글쓰기시 이름에 HTML 태그가 입력되지 못하도록 수정 (i2Sec 8기 강우창님께서 알려 주셨습니다.)
: login, logout시 외부로 리다이렉트 할 우려가 있어 url에 도메인을 지정하지 못하도록 수정 (i2Sec 8기 조민기님께서 알려 주셨습니다.)
: cheditor4의 삭제 코드에 문제가 있어 이번 버전부터는 cheditor4는 제외하고 배포합니다. (i2Sec 8기 조민기님께서 알려 주셨습니다.)
: 이외에도 i2Sec 8기 여러분들께서 SQL Injection 등의 오류를 알려 주셨으나 그누보드4가 소스코드를 오픈하고 있으므로
해당 오류는 SQL Injection으로 보기 어렵습니다. 도움주신 i2Sec 8기 여러분들께 감사의 말씀을 전합니다.
lib/common.lib.php 의
function bad120422($matches)
{
$code = $matches[1];
if (preg_match("#script#i", $code)) {
return "OBJECT 태그에 스크립트는 사용 불가합니다.";
} else if (preg_match("#base64#i", $code)) {
return "OBJECT 태그에 BASE64는 사용 불가합니다.";
}
}
// object 태그에서 javascript 코드 막기
$content = preg_replace_callback("#