jwmsg

CVE-2021-22205 긴급 패치하기

그렇습니다. 저도 갑작스럽게 이 RCE 가 터져서 문제가 좀 생겼습니다.

아마 이 게시물에 들어오신분들은 저와 같은 상황에 처해있거나 GITLAB CE/EE 운영하다가 문제가 생기신 분들일 가능성이 있습니다 저도 중 많이 받았어요.

특히 저처럼 AWS Lightsail 사용하시는분들도 꼭 확인하셔야 하는 이유가 있습니다. 저도 처음엔 당황스러웠는데요.

AWS 에서 메일이 날아왔습니다….

그대의 서버가 봇넷으로 이용당하고 있으니 조치하십시오…..

그래서 일단 부지런하게 원인이 뭔지 좀 밝혀내야 하지 않을까하고 페북에다가도 수소문을 해서 조금 검색해보니 최근 (2021년 11월 1일쯤?) 문제가 좀 있었던것 같습니다.


일단 무슨 문제일까?

깃랩의 설명에 따르면 이미지 올리거나 할때 EXIF 영역을 제거하는 부분이 있는듯합니다. 그래서 그부분을 ExifTool 이라는 녀석이 받아서 처리하는데, 이 ExifTool 이라는 녀석에게 RCE 취약점이 발견된것 같습니다. (EXIF에 대한 내용은 여기로)

일반적으로 gitlab.com 은 문제가 되지 않구요, 별도로 자체 Gitlab을 서버에 올려서 사용하시는 CE 또는 EE 유저들은 필히 이 문제를 꼭 확인하시기 바랍니다.


문제가 발생하는 서버 버전

다음 버전의 서버에서 발생하는데 보통 다들 깃랩 같은서버는 한번 올려놓고 딱히 업데이트 안하는것 같아서 이번에 대부분의 서버들은 패치되어야 할것 같습니다.

  • 11.9.x – 13.8.7
  • 13.9.0 – 13.9.5
  • 13.10.0 – 13.10.2

일단 내 서버가 당했을까?

일단 깃랩에서 친절하게 잘 설명하고 있습니다.

그런데 일단 한글로도 정리를 해야할것 같아서 여기다가 정리를 해보려 합니다.

일단 뭘 하기전에 항상,……

일단 스냅샷 부터 꼭 찍으시고 작업 하시기 바랍니다.

/var/log/gitlab/gitlab-workhouse 아래에 current 라는 로그파일이 있습니다. 해당 파일에서 grep 을 이용하여 “exiftool command failed” 를 검색하면 되는데요.

느낌이 쎄하다,,, stderr 을 보아하니 뭔가 다운을 받은것 같다,,,,

대충 뭔갈 다운받은듯한데, 뭔가 수상쩍은 stderr 혹은 stdout 부분이 발견되신다면 일단 내 서버가 털렸을 것에 집중을 하셔야 합니다.

해당 시간에 맞는 nginx 의 로그를 확인해 보셔도 좋습니다.

uploads/user 쪽으로 post 가 하나 날아들어온게 포착…

일단 빼박,, 저는 뭔가 느낌이 좋지 않습니다..

공격 당한것 같은데 어찌 해야 합니까?

지금 저도 공격 벡터 찾아서 분석중인데, 시간이 좀 걸릴것 같습니다.

확실한건 이번주 주말(11월 13일) 까지 상세하게 찾아보고 글을 써서 공유해볼 예정입니다.


패치는 어찌하면 좋습니까….

일단 가장 좋은 방법은 최신버전의 Gitlab CE로 업그레이드 하는겁니다만,,,

아시다시피,, 코드 저장소를 함부로 업그레이드를 갑자기 진행하기엔 좀 곤란한 부분이 있습니다.

하나의 솔루션으로는 ExifTool 부분의 소스코드만 별도로 패치하는것입니다만.

sudo su cd ~  
curl -JLO https://gitlab.com/gitlab-org/build/CNG/-/raw/master/gitlab-ruby/patches/allow-only-tiff-jpeg-exif-strip.patch  
cd /opt/gitlab/embedded/lib/exiftool-perl  
patch -p2 < ~/allow-only-tiff-jpeg-exif-strip.patch

일단 제가 해봤는데요, 왜인지 모르겠으나 저는 안되더라구요 (되시는 분들은 여기서 멈추시면 됩니다.)

이상하게 저는 FAILED 가 뜹니다. 그래서 저는 그냥 ExifTool이 돌지 못하게 막도록 하기로 했습니다. (그렇게 되면 자동으로 EXIF 를 처리하는 로직이 사라지니 혹시 필요하신 분은 좀 다른 방법을 찾으셔야 할듯 합니다)

/opt/gitlab/embedded/bin/exiftool 를 에디터 (VIM,등)으로 여시고,

#!/bin/bash

cat -

위 처럼 파일을 덮어 버리시기 바랍니다.

(저는 exiftool.bak 이라고 별도로 백업파일 만들어 두고 진행했습니다.)


패치가 잘 되었는지?

역시 직접 공격 넣어보시면 됩니다. 해당 CVE 코드를 기반으로 Git 에 돌아다니는 python 소스코드를 이용하여 테스트 해보실 수 있습니다.

일단, 저는 혹시나,,,, 하는 마음에 이 블로그에는 공유하지 않겠습니다. 별도로 잘 찾아보시기 바랍니다.

패치 전엔 공격 가능하다고 뜹니다.
패치가 잘 되면 불가 하다고 뜹니다.

마무리글…

이제, AWS 에 보고메일을 보내야 할듯합니다.

일단 워낙 긴급한 사안같아서 난리난듯 한데,

암튼 제 글솜씨가 좋지않아 두서없이 적은점은 죄송합니다 ㅠㅜㅠㅜ

다들 해결은 잘 하셨으면 좋겠습니다.

jwmsg

Twitter 데이터를 활용한 차기 대권주자 긍부정 통계 연구

오랜만에 의미 있는 연구를 하게 되어 기쁩니다.

본 프로젝트는 광운대학교 정보융합학부 “데이터시각화” 과목의 수업 일환으로 기말 프로젝트로 진행되었습니다. 본 프로젝트는 광운대학교 정보융합학부 정재완, 윤영훈 이 함께 진행한 프로젝트로, 저작권은 본 프로젝트를 수행한 두 사람에게 있음을 알립니다.

참고로 본 연구 프로젝트는 특정 정당 혹은 후보, 대권주자를 지지하지 않습니다. 사실 및 과학에 근거한 정보만 다룹니다.

주제선정

사실 주제선정이 가장 어려웠습니다. 일단 전제 조건이 “파이썬을 이용해야 한다”, 시각화는 “Tableau를 이용해야한다” 가 조건이었기에 상당히 제한적이었습니다. 데이터 셋도 국가 데이터를 이용하자니 데이터 셋이 많아 보이지 않았고, 그렇다고 거대한 데이터를 불러오는것도 2주만에 개발해야하는 입장에서는 무리수였습니다.

그래서 고심끝에 결정한게, Twitter API 를 갖고 있으니까, 이를 이용해서 뭔갈 해보자! 였습니다. 가장 사람들이 관심을 많이 갖고 있고, 한눈에 지표로 봤을때 도움이 되는게 무엇일지 생각끝에, “역시 정치와 관련된 게시물은 분석하기가 쉽다” 라는점을 이용하여 “트위터 데이터를 이용하여 2022 대권 주자를 언급하는 게시글의 긍부정을 통계로 나타내는 프로젝트” 를 진행하게 되었습니다.

진행과정

데이터의 수집

일단, 데이터를 수집하기 위해 서버를 만들었습니다.

피같은 정재완의 한달치 월급을 탈탈 털어서 산 서버 (램 192기가 CPU 2개짜리)

트위터 API 를 이용해서 수집을 해야하는데, 직접 REST 로 구현해서 데이터 불러오기엔 개발 시간이 턱없이 부족했습니다.. 그래서 뭔가 트위터 관련 라이브러리가 있지 않을까 싶어서 이것 저것 뒤져본 결과 tweepy 라는 python 모듈을 발견하였습니다.

일단 모듈을 쓰던 안쓰던 15분동안 최대 request 는 180회 할 수 있습니다. 그럼 1회당 100개씩 불러온다고 가정을 하면 18,000개의 트윗을 15분간 가져올 수 있다는 얘기인데, 한시간에 60분이니까, 한시간에 7만 2천개 쯤 가져올 수 있네요.

그래서 일일이 키워드별로 1주치 데이터 ( 11/30 00:00:00 ~ 12/07 12:00:00 ) 를 수집한 결과….

44만건 정도 될줄은 저도 몰랐습니다. (한 열 몇시간 걸린것 같아요.)

뽑아놓고 통계를 내보니, 각 대권 주자별로 업로드된 게시글 수가 다릅니다. (확실히 유명도 혹은 가장 구설수에 많이 오를 수록 게시글 빈도가 높게 나타났습니다.)

가나다 순입니다.

그리고 비 정상적으로, 특정 대권주자 한명의 글이 높은 빈도를 갖는 현상을 발견하였습니다. (이 당시 뉴스를 보시면 왜 이런 결과가 나왔는지 이해가 되실겁니다.)

데이터 전처리

긍정적인 글인지, 부정적인 글인지를 각각 처리해야 할 필요성이 생겼습니다. 해당 글의 긍부정과 그 비율 긍부정한 글을 작성하는 작성자의 유형에 따라 통계를 내기 위해 글 자체의 긍부정 판단을 어떻게 할지 고민을 하던 와중

Python의 Keras 를 활용하여 네이버 영화 후기 20만개를 학습시킨뒤, 글들의 긍부정 판단을 시도해 보았습니다.

긍부정 판단을 하기전 Konlpy 를 이용해서 한글 문장을 형태소 별로 분해하고, 빈도수 낮은 형태소를 제거하고 나머지를 토큰화 한뒤 사전에 러닝한 모델을 이용해 긍부정 판단을 시도하였으며, 그 결과 85% 의 신뢰 정확도를 보였습니다.

이를 DB에 저장하였고 부가적인 부분을 데이터 해석에 이용하였습니다.

데이터 해석

아무리 특정 주자가 해당 시점에 구설수에 많이 오른다고 해도, 누군가가 도배하지 않는한 이상하다고 판단이 들었습니다. 이에 “게시자 별로 대권주자에게 쓴 글 빈도수” 를 나타내 보았습니다.

위 그래프에서 볼 수 있듯, 특정 대권주자에게 부정적 글을 대량 작성한 게시자의 존재를 확인해 볼 수 있었습니다. 반대로 긍정적인 글을 작성하는 경우도 존재 했구요. 그렇기에 오로지 게시글로만 대권주자의 긍부정을 판단하는데에는 문제가 있어 보였습니다.

그리고 더더욱 문제인것은, “트위터와 같은 SNS 는 부정적인 글이 많은 공간” 이라는 특이성이 존재하다보니, 대부분의 글들이 부정적으로 편향되어 있음을 파악했습니다.

주황색이 부정, 파랑색이 긍정

그래서 게시자들 별로 대권 주자에 대한 긍정과 부정 평균 비율을 스팩트럼으로 나타낸 뒤, 50% 를 기점으로 긍정적 게시자와 부정적 게시자를 통계를 내어 보았습니다. (게시글로 판단하는건 의미가 없어 보여, 중복을 제거하고 대권 주자에 대한 지지 성향 비율을 표현하고자 했습니다.)

이렇게 보니까 좀 골고루(?) 퍼져 보이긴 했습니다. 물론 평균적으로 30%(부정적인측면) 사람들이 대다수였지만, 스펙트럼이 골고루 퍼져 보여서 통계 내는데 괜찮아 50% 기준으로 딱 잘라 긍정적 평가를 하는 인원수를 표현 한 결과

이런 그래프가 나왔는데, 뭔가 어디서 많이 본듯한 그래프가 나왔습니다.

상위 3인은 한길 리서치와 비슷하지 않은가요? (실제로 우리 연구에서도 6인만 대권 주자로 뽑아서 처리 했습니다) 그리고 하위 3인은 한국갤럽과 비슷한 양상을 보이고 있었습니다.

분석 연구 결론

트위터나 SNS 만큼 확실하게 나타나는 여론 혹은 나타나는 현상은 없다고 생각이 듭니다. 확실히 SNS 트랜드를 뽑으면 현재 해당 키워드에 사람들이 얼마나 반응하는지, 얼마나 긍정적이고, 얼마나 부정적인지 알아내는데에 꽤 정확도 높은 지표를 뽑을 수 있을 것이라고 판단 되었습니다.

물론 이번 연구에서는 “확실하게 SNS 데이터를 통해 가시적으로 보여줄 수 있는” 정치적 요소를 활용 했지만, 본 연구가 결코 정치적인 요소에서 끝나지 않고, 다양한 방면에서 활용될 수 있는 가치가 되었으면 좋겠습니다.

혹시 본 연구에 대한 궁금증 혹은 문의가 있으신 분은 본 사이트 하단의 연락처로 문의 바랍니다. 긴 글 읽어주셔서 감사합니다.

jwmsg

audit failure when kde invent push(Non-full name)

so, I tried push my local sources to my repository. but I faced some error : hook declined to update refs/hands/{my branch}

error….
the message is..
remote: Audit failure - Commit {commit hash} - Non-full name : jwmsg
I remembered what I set up
git config --global user.name "jwmsg"

So, I changed my name to Full Name
git config --global user.name "Jaewan Jeong"

And I change The commit log

and I push it

success.


jwmsg

ubuntu에 mysql을 설치해보자

사실 설치는간단하다. 단지, 뭔가 설정을 해줘야 하겠지만…
최근 ubuntu 18.04 가 출시하면서 mysql 설정방식이 바뀌었다. 카더라

ubuntu에 mysql 설치하는 방법
$ apt-get install mysql-server
위 처럼 명령어를 치면, 자동으로 mysql 이 설치된다.

mysql 쉘에 접속할땐

$ mysql
를 치면 된다(설치된 ubuntu 내에서 치세요)

그럼 계정을 추가해보자.

mysql> create user '사용자명'@'접속IP' identified by '사용자암호';
여기서 사용자 명은 접속ID라고 생각하면 좋다.
필자는 ubuntu 라고 하겠다.
접속 IP는 해당하는 IP만 들어올 수 있다. 저기에 적은 IP만 해당 ID로 DB에 접근이 가능하다.
그런데, ‘%’ 를 쓰면 모든 아이피에서 접근할 수 있다 ㅎ (만약 다른 외부 IP로 접근을 원한다면, 이 글을 끝까지 읽길 바란다.)

이제 스키마(데이터베이스) 에대한 권한을 주자.
그전에, 당연히 스키마가 추가 되어야 한다. 그 내용은 좀더 아래에 명시한다.

mysql> grant all privileges on 스키마.테이블 to '사용자명'@'접속IP' identified by '사용자암호';
mysql> grant all privileges on 스키마.테이블 to '사용자명'@'접속IP'; 암호부분을 지워도 작동은 하는것 같더라.
여기서 스키마 부분에 *을 넣으면 모든 스키마 를 지칭한다. 마찬가지로 테이블에 * 을 넣어도 모든 테이블을 지칭한다.
그럼 모든 스키마와 테이블 권한을 줄땐
mysql> grant all privileges on *.* to '사용자명'@'접속IP';
이라고 할것이고,
dkdk라는 스키마에 모든 테이블 권한을 줄땐
mysql> grant all privileges on dkdk.* to '사용자명'@'접속IP';
가 될것이다.

스키마를 추가하는 방법!
mysql> create schema '스키마이름' 이렇게 해도 되고.
mysql> create database '스키마이름' 이렇게 해도 된다.
스키마 == 데이터베이스 이다.

엇! 그런데 외부에서 접속이 안된다. 왜일까?
$ netstat -nltp | grep mysql 을 쳐보자
listening 에서 127.0.0.1 을 볼 수 있을 것이다.
이거를 0.0.0.0 으로 만들어야겠죠? 이럴땐 아래와 같이 합니다 (ubuntu 18.04, mysql 버전 8이상)

/etc/mysql/mysql.conf.d/my.cnf
를 수정하자.

약 43번째 줄에,
bind-address = 127.0.0.1
bind-address = 0.0.0.0 으로 바꿔준다.
그리고 나서
$ service mysql restart
mysql 을 재시작 하면!!! 외부에서 붙을 수 있을 것이다.