본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android 10] 모든 앱에 해당하는 동작 변화

by 돼지왕왕돼지 2020. 3. 14.

[android Q] 모든 앱에 해당하는 동작 변화


https://developer.android.com/about/versions/10/behavior-changes-all


Non-SDK interface 제한


-

Pie 부터 Non-SDK interface 제한이 시작되었다.

Q 에서는 해당 list 를 업데이트하였다.

목표는 모든 private api 를 제거하는 것이다.



-

Android Q 를 target 하지 않는다면, 몇몇 변화는 즉각적으로 영향을 미치지 않을 것이다.

하지만 현재 greylist 에 있는 non-SDK interface 를 사용한다면, 이것은 미래에 어떻게든 high risk 로 돌아올 것이다.



-

만약 앱이 non-SDK interface 를 사용하는지 확실치 않다면 테스트 해서 찾아내라. (로그에 찍힌다.)

그리고 찾아냈다면, SDK 대체수단으로 migration 을 고려해야 한다.

만약 대체 sdk interface 를 찾을 수 없다면 새로운 public API 를 요청하라.




Gesture Navigation


-

gesture navigation 을 enable 할 수 있다.

이는 target 과 상관없이 모든 앱에 적용된다.

특별히 화면의 특정 영역에 대해 gesture 를 override 하지 않으면 모든 앱에서 system gesture 가 작동한다.




NDK


-

자세한 내용은 생략




생체 lib 과 동적 linker path 의 변화


-

Q 부터는 몇몇 path 가 실제 파일이 아닌 symbolic link 로 대체된다.

그래서 path 에 의존한 경우 문제가 될 수 있다.


* /system/lib/libc.so -> /apex/com.android.runtime/lib/bionic/libc.so

* /system/lib/libm.so -> /apex/com.android.runtime/lib/bionic/libm.so

* /system/lib/libdl.so -> /apex/com.android.runtime/lib/bionic/libdl.so

* /system/bin/linker -> /apex/com.android.runtime/bin/linker



-

자세한 내용은 생략한다.




시스템 바이너리/라이브러리가 execute-only memory 에 매핑되었다.


-

실행 가능한 시스템 바이너리와 라이브러리 조각들이 "코드 재사용 공격” 의 방어 강화 기술의 일환으로, execute-only(non-readable) memory 로 매핑되었다.

의도적인 혹은 의도적이지 않은 해당 메모리 seg 의 읽기는 execute-only 로 mark 되어 SIGSEGV 를 throw 할 예정이다. ( 버그던, 취약하던, 의도적인 메모리 조사이던간에 )



-

왜 crash 가 났는지 보려면, 관련된 tombstone file 을 /data/tombstones/ 에서 확인해 볼 수 있다.

execute-only 관련된 crash 는 다음과 같은 메시지를 갖는다.

Cause: execute-only (no-read) memory access error; likely due to data in .text.



-

자세한 내용은 생략한다.




보안


* TLS 1.3 enabled by default


-

TLS 1.3 에서는 cipher suites 를 customize 할 수 없다.

setEnabledCipherSuites() 를 통한 disable 시도는 무시된다.



-

TLS 1.3 이 negotiate 할 때, HandshakeCompletedListener 가 session 이 session cache 에 추가되기 전에 불린다.

(1.2 에서는 후에 불렸다.)



-

특정 상황에서 SSLEngine 이 SSLHandshakeException 을 던졌었다.

그러나 이제 SSLProtocolException 을 던진다.



-

0-RTT mode 는 지원되지 않는다.



-

SSLContext 를 취득해서 TLS1.3 을 disable 시킬 수 있다. (SSLContext.getInstance("TLSv1.2")

또한 setEnabledProtocols() 를 통해 connection 단위로 protocol version 을 조정할 수도 있다.



* Certificates signed with SHA-1 arent' trusted in TLS


-

SHA-1 알고리즘으로 서명된 인증서는 TLS 에서 신뢰되지 않는다.

이런 root 인증서는 2016 이후로 발급되지 않고 있다. Chrome 을 비롯한 메이저 브라우저에서 더 이상 신뢰되지 않기 때문이다.



* KeyChain behavior changes and improvements


-

크롬같은 몇몇 브라우저에서는 TLS server 가 인증서 요청 메시지를 보냈을 때 (TLS handshake 에서)인증서를 선택할 수 있게 해준다.

Android 10 에서는 KeyChain.choosePrivateKeyAlias() 호출을 통해 인증서 선택창을 보여준다.

선택할 인증서가 없는 경우에는 (서버 요구사항에 안 맞거나, 인증서가 하나도 없거나) 해당 창은 보여지지 않는다.



* Other TLS and cryptography changes


-

자세한 내용 생략






Wifi Direct broadcast


-

Q 부터는 다음 broadcast 들이 더 이상 sticky 하지 않다.

    WIFI_P2P_CONNECTION_CHANGED_ACTION

    WIFI_P2P_THIS_DEVICE_CHANGED_ACTION



-

자세한 내용은 생략.




Wifi 인지 능력들


-

Wifi ware data path 들을 이용하며 TCP/UDP Socket 을 만드는 것을 쉽게 하였다.



-

자세한 내용은 생략.




Go 단말에서의 SYSTEM_ALERT_WINDOW


-

Go 버전의 Android Q 에서 동작하는 앱은 SYSTEM_ALERT_WINDOW 권한을 받을 수 없다.

이유는 overlay window 를 사용하는 것은 엄청난 양의 메모리를 사용하고, 이는 low-memory android 단말에 취약함을 제공하기 때문이다.



-

Go 버전의 Q 미만 OS 에서 동작하는 앱은 SYSTEM_ALERT_WINDOW 권한을 받고, 해당 앱은 Q 로 업그레이드 해도 해당 권한을 유지한다.

하지만 OS 가 Q 로 업그레이드 되기 전 취득을 못하면, 그 이후에는 취득할 수 없다.



-

자세한 내용은 생략한다.




앱이 오래된 android version 을 target 하면 경고를 보여준다.


-

app 을 처음 실행할 때 target 이 old version 이면 (Q에서는 Android 6.0, API Level 23, MOS 미만) 유저에게 경고를 보여준다.

만약 앱이 권한을 요구한다면(돼왕 : 하위단말에서는 설치시 자동 grant 였기 때문에), 유저는 앱이 처음 실행되기 전에 권한에 대한 조정을 할 수 있다.



-

구글의 target API 요구사항에 의거, 유저는 이런 경고를 최근까지도 update 를 하지 않은 앱들에 대해서만 볼 것이다.

다른 스토어를 통해 배포되는 경우에도 비슷한 target API 정책이 2019에 도입되었기 때문에 비슷할 것이다.




SHA-2 CBC cipher suites 제거


-

다음이 시스템에서 제거되었다.


* TLS_RSA_WITH_AES_128_CBC_SHA256

* TLS_RSA_WITH_AES_256_CBC_SHA256

* TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256

* TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384

* TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

* TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384




앱 사용


-

UsageStats 앱 사용 개선 : 앱이 split-screen, PIP 모드 등에 있어도 좀 더 정확하게 UsageStats 를 추적한다.

앱 단위 grayscale : 앱 단위의 grayscale 디스플레이 모드를 설정할 수 있다.



-

자세한 내용 생략.




HTTPS connection changes


-

setSSLSocketFactory 에 null 을 전달하면, IllegalArgumentException 이 발생한다.

이전의 null 전달은 current default factory 를 전달하는 것과 효과가 같았다.




android.preference lib 은 deprecate 되었다.


-

AndroidX 의 preference lib 을 사용해야 한다.




Zip file utility library changes


-

java.util.zip pkg 에 변화가 생겼다.

안드로이드와 다른 platform 간의 상호 호환이 잘 되도록 변경되었다.



-

자세한 내용은 생략..




카메라 변경


-

많은 카메라 앱이 단말이 portrait 설정이라고 가정한다.

과거에는 안전한 가정이었을 수 있지만, 폴더블과 같은 단말들이 나타나면서 그렇지 않다.




배터리 사용 트레킹


-

SystemHealthManager 는 단말이 주된 충전 event 후에 unplug 되면 베터리 사용 통계를 reset 한다.

주된 충전 event 란, 단말이 완충되거나, 거의 방전에서 거의 완충으로 변한 상태를 말한다.


Q 이전에는 배터리 사용 통계는 항상 unplug 되면 reset 되었다.




Android Beam deprecation


-

공식적으로 deprecate 되었다.




댓글0