username 과 password 입력창에 보안설정이 안되어있다면 키보드는 이를 일반 텍스트 취급하여 입력한 username/password를 추천, 학습 데이터로 보관할 수 있다.
# 안전한 예시 코드(자동완성에 남을 가능성을 줄이는)
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:imeOptions="flagNoPersonalizedLearning"
android:importantForAutofill="no" />
각 속성이 서로 다른 경로를 막게 설정하는 방법으로
android:inputType="textPassword"
입력값을 비밀번호로 취급하게 하여 문자열 마스킹 처리하고 자동수정 및 추천을 적용하지 않도록 유도하여 일반 텍스트와는 다른 보안 입력 모드를 사용하게 한다.
하지만 화면을 가리는 것 만으로는 저장이나 유출을 완전하게 막는것은 아니기 때문에
android:imeOptions="flagNoPersonalizedLearning"
키보드 앱에 이 입력값을 개인화 학습에 사용하지 않도록 추가한다.
하지만 키보드 앱이 이 플래그를 제대로 준수해야한다는 한계가 있다.
android:importantForAutofill="no"
Android Autofill 서비스가 이 필드를 자동완성 대상으로 취급하지 않게 처리한다.
| 속성 | 보호대상 |
|---|---|
textPassword | 화면 노출, 일반 키보드 추천·자동수정 |
flagNoPersonalizedLearning | 키보드 개인화 학습·캐시 |
importantForAutofill="no" | Android Autofill 서비스 |
# shout out to codex
String logMessage = "Username: " + username.getText() + " and Password: " + password.getText() + " are verified";
Log.i("Info:", logMessage);
System.out.println(logMessage);
문제 속 취약한 코드는 다음과 같다.
Log.i()로 평문 비밀번호를 그대로 찍음 → adb logcat 붙일 수 있는 사람(같은 기기 다른 앱, USB 디버깅, 루팅된 기기 등)이면 그대로 탈취 가능System.out.println()까지 중복으로 찍는 것도 마찬가지로 logcat에 노출됨 (System.out/err도 결국 logcat으로 리다이렉트됨)# powershell
>adb logcat -e "Username"

겨우 찾았다;;
CTRL + C, V 원리
클립보드 -> OS가 관리하는 공유 메모리 영역
CTRL+C
1. 키보드 인터럽트가 발생하여 OS가 복사 단축키로 인식
2. 포커스된(마우스로 영역 지정 혹은 이미지) 애플리케이션한테 복사하도록 신호를 보냄
3. 그 앱이 자기가 선택한 데이터를 OS의 클립보드 API에 넘김(Windows는 OpenClipboard() -> SetClipboardData() 같은 Wind32 API 호출)
4. OS는 이 데이터를 커널이나 클립보드 매니저가 관리하는 메모리 영역에 저장
-> 즉 클립보드는 파일이 아닌 RAM에 잠깐 존재하는 데이터
-> 다양한 포맷으로 동시에 여러개를 저장할 수 있음
CTRL+V
CTRL+C와 반대로 동작
1. 입력 감지
2. 포커스된 앱이 OS 클립보드 GetClipboardData() 호출
3. 클립보드가 지원 포맷 목록을 알려주고 앱이 처리 가능한 포맷 골라서 요청
4. 해당 데이터를 받아서 커서 위치에 삽입
다음 시간에 계속 ...