Wi-Fi

hostapd WPA2/WPA3 무선랜 인증 실패 이슈 디버깅(/dev/random 관련 이슈)

Beans 2020. 9. 7. 21:25

회사에서 hostapd를 사용하여 개발을 진행 중인데, hostapd를 사용하다 보면 종종 .conf 파일의 항목들을 변경하지 않아도, 단말에서 비밀번호 인증이 안되는 케이스가 발생했습니다.

 

특별히 설정값을 바꾸거나, 어떤 동작을 한 것도 아닌데 빈번히 인증이 안되는 경우가 있어서 로그를 찍고 추적을 좀 해 보니, 다음과 같은 메시지를 확인 할 수 있었습니다.

root@root-desktop:/etc/config# hostapd hostapd.conf
Configuration file: hostapd.conf
wlan0: interface state UNINITIALIZED->COUNTRY_UPDATE
wlan0: interface state COUNTRY_UPDATE->HT_SCAN
Using interface wlan0 with hwaddr ff:ff:ff:ff:ff:ff and ssid "test_ssid"
random: Cannot read from /dev/random: Resource temporarily unavailable
random: Only 0/20 bytes of strong random data available
random: Not enough entropy pool available for secure operations
WPA: Not enough entropy in random pool for secure operations - update keys later when the first station connects
wlan0: interface state HT_SCAN->ENABLED
wlan0: AP-ENABLED
wlan0: IEEE 802.11 driver had channel switch: freq=5180, ht=1, vht_ch=0x0, offset=1, width=3 (80 MHz), cf1=5210, cf2=0
wlan0: CTRL-EVENT-CHANNEL-SWITCH freq=5180 ht_enabled=1 ch_offset=1 ch_width=80 MHz cf1=5210 cf2=0 dfs=0
wlan0: AP-CSA-FINISHED freq=5180 dfs=0

문제가 되는 내용은 random 에서 뱉어낸 에러로 보였고,

random: Cannot read from /dev/random: Resource temporarily unavailable
random: Only 0/20 bytes of strong random data available
random: Not enough entropy pool available for secure operations

hostapd나 wlan 드라이버 쪽에서 /dev/random을 open하여 사용하다가 리소스가 부족하여 /dev/random을 사용하지 못하는 이슈로 추정되었습니다. 

 

/dev/random의 작동 방식을 모르는 상태였기 때문에, 에러메시지 키워드로(hostapd, wpa3)로 주구장창 검색 해 보았는데, 쉽사리 답은 나오지 않았습니다.

 

1차적으로 찾아본 해결책은 다음과 같습니다.

codz.me/2017/06/10/can-not-read-from-dev-random/

forum.archive.openwrt.org/viewtopic.php?id=30931

 

OpenWrt Forum Archive

Well, finally I came back to original firmware and reflashed with BF 10.03.1-rc5 again. Now it's working using the hack. So the issue about /dev/random is still there and I've checked over 2 APs TL-WR1043nd I wonder why that is occurring.. Thanks in advanc

forum.archive.openwrt.org

 

해당 링크에서 제시한 해결책들은, /dev/random이 busy 하면 /dev/urandom을 사용하라는 정도의 글인데 이런 방법으로는 근본적인 문제를 해결하는 방법은 아니였고, urandom을 사용하다 보면 또 같은 문제가 발생 했습니다.

 

추가적으로 어플리케이션에서 hostapd가 /dev/random 값을 가져오지 못하여 해당 문제 상황으로 돌입한 것을, 현재 popen(hostapd...) 방식으로 실행하는 상황이라, 코드상으로 알 수가 없었습니다.

 

그래서 우선 /dev/random의 사용법을 좀 찾아보다 보니, 힌트를 얻을 수 있었습니다.

howtoSecurity-HOWTO-7:doc.kldp.org/HOWTO/html/Security/Security-HOWTO-7.html

 

리눅스 보안 하우투: 커널 보안

IP: syn 쿠키 (CONFIG_SYN_COOKIES) SYN 공격은 모든 사용 가능한 자원을 소비하게 한다는 식의 방법으로, 결과적으로 리부팅을 하게 만드는, 서비스 거부 공격법 (DoS, Denial of Service)의 하나이다. 켜 놓지 �

doc.kldp.org

위의 하우투 내용 중 현재 필요한 (/dev/random, /dev/urandom)관련 내용을 요약하자면

  • /dev/random 및 /dev/urandom은 랜덤 데이터를 사용할 수 있도록 커널에서 제공한다.
  • 보안 상 난수 발생 기능이 필요한 경우, SSH 키 생성 등 난수를 이용하여 Key를 생성시키는 경우에 활용 가능하다.
  • /dev/random은 사용자 입력(user-generated entry, I/O)이 발생시키는 인터럽트로, entropy가 충분해지면 난수를 제공한다.
  • 디바이스 드라이버(ex-키보드, 마우스) 등 여러 소스에서부터 수집된 노이즈를 이용하여 난수를 발생시킨다.
  • /dev/random은 엔트로피가 충분해져야만 난수를 제공한다.
  • /dev/urandom은 유사한 방식으로 난수를 제공하지만, 엔트로피가 충분하지 않아도 난수를 발생시킨다.

간단히 요약하면, 사용자의 여러 불규칙적인 입력을 이용하여 난수를 생성 한다는 것으로 이해했습니다.

 

/dev/random은 사용자 입력이 충분해져서 자신의 엔트로피 할당량이 충분해져야 난수를 생성하고, urandom은 충분하지 않아도 생성한다고 합니다. 

 

그에 따라서 해당 /dev/random 내용에 따라서 이슈를 분석해 보면

  • 개발 중 hostapd를 지속적으로 재실행 했음
  • WPA3 모드로 운용중인 hostapd가 /dev/random에서 지속적으로 난수를 요청하여 활용
  • /dev/random의 엔트로피 값은 부족해짐(여기서 엔트로피가 생성될 때까지 충분한 시간이 있었다면, wpa3 인증에 실패하는 이슈는 발생하지 않음)
  • random: Cannot read from /dev/random: Resource temporarily unavailable 에러 발생시키며 WPA Key 생성에 실패함
  • 따라서 무선 단말 연결 시 인증에 실패함
  • 재시작 하는 간격이 충분히 있었다면 해당 이슈는 발생하지 않았기 때문에 개발 중엔 인지하지 못함
  • 해당 이슈를 해결하기 위해서는, /dev/random의 엔트로피를 지속적으로 채워주어야 함

구글링을 좀 하다 보니, 저처럼 hostapd를 사용하는 사람이 아니라 다른 어플리케이션들을 이용 하다가도 비슷한 맥락의 에러를 겪는 케이스가 상당히 많이 보였습니다(톰캣... 아파치... 등) 

 

현재 사용가능한 엔트로피 값을 1초마다 확인하면서, /dev/random 값을 지속적으로 읽어 보았습니다.

 

1초마다 현재 엔트로피 확인

while true; do cat /proc/sys/kernel/random/entropy_avail; sleep 1 ; done ;

 

/dev/random 이용하여 랜덤값 추출

od -tx1 -v -N16 /dev/random | colrm 1 8 | tr -d ' '

 

위의 정보에서 확인 한 대로, od /dev/random을 이용하여 계속해서 읽어오면 entropy_avail의 값이 0에 근접해졌고, 이 때 hostapd를 wpa2/wpa3 모드로 실행 시켜 보면, 먼저 확인했던 "random: Cannot read from /dev/random: Resource temporarily unavailable" 이슈가 재현 되었습니다.

 

이것을 해결하기 위한 방법을 생각 해보면 크게 두가지 정도인데

  • 엔트로피를 지속적으로 발생시킨다.
  • /dev/urandom을 사용한다.

엔트로피를 지속적으로 발생시키는 방법을 찾다 보니, 

 

다른 사람들이 유사한 문제를 해결할 때 , rngd 를 활용하여 해결한 케이스가 조금 있었습니다.

 

따라서 rngd 를 사용하는 방법으로 문제 해결을 시도했습니다.

rngd(8) - Linux man page

Name

rngd - Check and feed random data from hardware device to kernel

random device

Description

This daemon feeds data from a random number generator to the kernel's random number entropy pool, after first checking the data to ensure that it is properly random.

sudo apt-get install rng-tools

rng-tools를 설치하여 rngd를 설치하여 시험 해 보았는데, rngd 실행 후에는 entropy_avail의 값이 0 근처도 가지 않고 거의 최대값으로 유지 되었습니다. 

 

따라서 wpa2/3 실행 시 발생하던 /dev/random 읽기 실패하는 이슈는 해당 조치로 해결 되었을 것입니다.

 

...

당장 눈앞의 문제는 rngd를 이용하여 해결되었으나, 엔트로피를 지속적으로 발생 시키면서 cpu 점유율도 조금 차지하는 것 같고, 실제로 여러번 hostapd를 시험 해 보아야 진짜 문제가 해결된 것인지 확인할 수 있을 것 같네요.

 

이렇게 했는데도 또 무선 보안 인증이 실패하는 이슈가 발생하면... 어디서부터 다시 봐야할지도 잘 모르겠네요

 

읽어주셔서 감사하고 본문 중 이상한 부분이나 이해가 잘 가지 않는 부분이 있다면 댓글로 남겨주세요

 

감사합니다

 

 

 

'Wi-Fi' 카테고리의 다른 글

WIFI(802.11 표준) 기본 개념 정리  (0) 2018.10.01