SSL을 사용한 API 고정 보호의 중요성

6535 단어 androidtlssslsecurity

전언


네트워크는 대부분의 응용 프로그램의 핵심 부분으로 응용 프로그램 클라이언트와 백엔드 시스템 사이에서 정보를 전달한다.이런 통신의 매우 표준적인 방법은 TLS이다. 이것은 통신 각측 간의 정보 완전성과 정보 프라이버시를 위한 협의이다.TLS 프로토콜을 사용하여 연결을 설정할 때 첫 번째 단계는 인증서를 제공하고 검증하는 것입니다.
예를 들어 클라이언트가 요청을 시작하면 서버는 한 개 이상의 디지털 인증서로 응답한 다음에 클라이언트가 검증한다(또는 검증하지 않는다).이 검증은 통신 실체 간에 신뢰를 구축한다.신뢰가 구축되면 암호화 절차를 시작할 수 있고 마지막으로 상기 암호화/복호화 방안으로 정보 교환을 할 수 있다.
따라서 SSL 인증서를 설정하고 TLS 프로토콜을 호출함으로써 우리의 귀중한 기밀 정보는 전방과 후방 시스템 간에 안전하게 통신할 수 있습니다. 그렇습니까?
많은 개발자들이 이렇게 생각하고 TLS 세션의 처리를 운영체제에 남겨 둔다.

빠른 역사 여행


기본적으로 모든 응용 프로그램은 시스템 루트 인증서를 신뢰하지만, 안드로이드 7 (Nougat) 이전 버전에서도 기본적으로 사용자가 정의한 인증서를 신뢰합니다.개발자의 개입 없이 안드로이드 7 및 이후 버전에서 기본적으로 사용자 정의 인증서를 받지 않도록 변경된 것은 명백한 보안 문제입니다.비록 이것이 확실히 통신을 즉각 납치할 수 없게 하지만, 매우 간단한 노력은 즉각 안전 문제를 해결할 것이다.
안전하다고 여겨지는 채널에서 감청이 얼마나 쉬운지 봅시다.

무대를 세우다


실제 세계의 예를 보면 스웨덴 고드버그시의 공식 주차 앱Parkering Göteborg을 선택했다.
주차 애플리케이션으로서 흐르는 정보는 자동차 번호판, 충전용 신용카드, 개인 사용자 정보 등을 포함하는데, 이러한 정보는 확실히 안전해야 한다.
면책 성명: 약 6개월 전에 이 프로그램의 개발자와 연락을 했고 그들이 이곳에서 제기한 문제를 의식하도록 했다.그때부터 이 프로그램은 보안을 포함한 많은 업데이트를 받았다.

HTTPS 트래픽 공개


다음은 운영체제에 의존하여 세션의 모든 정보를 처리하는 안드로이드 프로그램에서 TLS 통신을 공개하는 방법을 간략하게 소개한다.

필요한 도구:

  • APKTool

  • Charles Proxy(Fiddler2 사용)
  • Java 빌드 도구 24.02+
  • Android SDK
  • Java 빌드 도구 및 Android SDK는 apk에 서명하는 데만 사용됩니다.

    응용 프로그램으로 하여금 사용자 인증서 발급 기구를 신뢰하게 하다


    응용 프로그램은 Android 7에서부터 장치 신뢰 사용자 인증 기관(Android 7부터) 때문에 사용자 인증 기관을 신뢰할 수 없기 때문에 응용 프로그램에 대해 작은 수정을 해야 합니다.

    대상 애플리케이션의 apk 다운로드


    일반적으로 APKMirror 또는 유사한 웹 사이트에서 애플리케이션을 찾을 수 있습니다.
    예: APKPure

    apk 파일 디코딩

    apktool d app.apk -o decoded_app

    AndroidManifest를 수정합니다.xml

    decoded_app 폴더에서 AndroidManifest.xml 파일을 찾아서 엽니다.android:networkSecurityConfig="@xml/network_security_config"application 탭에 추가합니다.
    <!-- AndroidManifest.xml -->
    ...
    <application 
        android:allowBackup="false" 
        android:appComponentFactory="androidx.core.app.CoreComponentFactory" 
        android:icon="@mipmap/ic_launcher" 
        android:label="@string/parking_application_name" 
        android:name="se.goteborg.pbolaget.android.ParkingApplication" 
        android:theme="@style/AppTheme"
        android:networkSecurityConfig="@xml/network_security_config"
        >
    ...
    

    신뢰 사용자 인증 기관


    프로그램이 사용자 정의 인증서를 다시 신뢰하도록 하려면, 네트워크 보안 설정 파일은 사용자 파라미터를 인증서 표시줄에 추가하기만 하면 됩니다.network_security_config.xml 파일
    <!-- network_security_config.xml -->
    <network-security-config>  
        <base-config>  
            <trust-anchors>
                <!-- Additionally trust user added CAs -->  
                <certificates src="user" />  
            </trust-anchors>  
        </base-config>  
    </network-security-config>
    
    network_security_config.xmldecoded_app/res/xml 폴더에 추가합니다.

    apk 파일 재구성

    apktool b decoded_app -o ca_modified_app.apk새 apk 파일은 decoded_app/dist/ca_modified_app.apk 또는 decoded_app 폴더에서 찾을 수 있습니다.

    수정된 응용 프로그램에 서명


    여기에서 기본으로 만든android 디버그 키 라이브러리로 apk에 서명합니다jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore {some_path_x}\.android\debug.keystore {some_path_y}\ca_modified_app.apk androiddebugkey -storepass android

    수정된 어플리케이션 설치

    ca_modified_app.apk를 안드로이드 장치로 이동하고 설치를 누릅니다.
    Google Play 외부의 설치를 신뢰해야 할 수도 있습니다(프롬프트).
    현재, 우리 장치에는 사용자가 정의한 인증서를 신뢰하는 원시 프로그램의 복사본이 실제로 설치되어 있습니다.
    이제 우리는 이런 인증서를 설치하기만 하면 된다.

    Charles에 대한 SSL 인증서 설치


    디바이스 액세스https://chls.pro/ssl에서 Charles SSL 인증서를 다운로드합니다.
    다운로드가 완료되면 인증서를 설치합니다.

    중개인


    이 단계에서는 HTTP(S) 에이전트를 사용하여 PC를 클라이언트와 서버 사이의 중개로 설정합니다.
    장치가 연결된 WiFi 네트워크에 대한 네트워크 설정을 엽니다.
    무선 랜→ 긴 누르기 연결 네트워크→ 네트워크 수정→ 고급 옵션→ 프록시를 수동으로 설정→ 호스트 이름으로동일한 네트워크에 연결되어야 하는 컴퓨터의 IPv4 주소를 입력합니다.→ CharlesProxy는 포트로서 8888로 기본값입니다.

    Charles에서 SSL 프록시 사용


    최상위 메뉴→ 대리점→ SSL 프록시 설정→ SSL 에이전트→ SSL 프록시 사용 을 선택합니다.→ 위치 호스트 =* 및 포트 =* (와일드카드) 포함

    읽기 네트워크 트래픽


    현재 탐색 프로그램은 SSL 에이전트를 통해 모든 네트워크 데이터를 다시 지정합니다. 이 장치는 이 인증서를 신뢰하고, 데이터가 에이전트 (Charles) 에 표시되며, 암호화되지 않은 https 요청과 응답을 표시합니다.

    SSL 고정


    그렇다면 개발자로서 우리는 이 문제를 피하기 위해 무엇을 할 수 있을까?핀.
    SSL 고정은 애플리케이션 자체에 서버 인증서를 포함해야 하는 기술입니다.일단 네트워크가 연결되면 응용 프로그램은 응답 실체의 인증서와 끼워 넣은 인증서를 간단하게 비교할 수 있다.만약 그것들이 일치하지 않는다면, 아마도 우리 서버에서 온 응답이 아닐 것이다.SSL 보안 구현에 대한 자세한 내용은 the docs를 참조하십시오.

    그렇지만


    SSL 고정은 간단하지만 이 안전 설치를 건너갈 수 있습니다.그러나 이것은 더욱 복잡한 과정으로 설비에 대해 루트 처리를 해야 한다.아, 우리는 완전한 안전을 실현할 수 있는 일이 매우 드물다.

    업데이트


    최신 안드로이드 버전 안드로이드11(2020년 9월 8일)에는 더 많은 인증서 설치 제한이 도입됐지만, 앱이 제시하는 제한만 있는 것으로 보인다.따라서 이것은 응용 프로그램이 본고에서 소개한 중간자 공격을 자동으로 실행하는 것을 방지할 수 있지만 수동 과정은 여전히 유효할 수 있다.
    나는 네가 이 박문을 좋아하길 바란다.만약 당신에게 어떤 문제가 있으면 언제든지 아래에서 평론을 발표하세요!

    좋은 웹페이지 즐겨찾기