앱 정보
- level11은 비밀 노트 애플리케이션으로 4자리 숫자의 PIN 코드를 설정한 후 노트를 확인할 때 설정한 코드를 인증하여 비밀 노트를 확인할 수 있는 애플리케이션이다.
기본 화면은 다음과 같으며, 4자리 PIN 코드를 입력할 수 있는 칸과 PIN 코드 입력 후 생성/변경할 수 있는 버튼 그리고 비밀 노트로 이동하는 버튼으로 구성되어 있다.
비밀 노트로 이동하기 이전에 PIN 코드 입력 후 생성/변경 버튼을 눌러준다.
이동하면 PIN 코드를 입력할 수 있는 칸과 비밀 노트에 접속하는 버튼으로 구성되어 있으며, 이전에 설정한 코드를 입력한 후 버튼을 눌러 노트에 접속해준다.
이동하면 다음과 같은 정보를 확인할 수 있다.
앱 분석
addPin()
public void addPin(View view) {
SharedPreferences.Editor spedit = PreferenceManager.getDefaultSharedPreferences(this).edit();
String pin = ((EditText) findViewById(R.id.aci3Pin)).getText().toString();
if (pin == null || pin.isEmpty()) {
Toast.makeText(this, "Please Enter a valid pin!", 0).show();
return;
}
Button vbutton = (Button) findViewById(R.id.aci3viewbutton);
spedit.putString(getString(R.string.pkey), pin);
spedit.commit();
if (vbutton.getVisibility() != 0) {
vbutton.setVisibility(0);
}
Toast.makeText(this, "PIN Created successfully. Private notes are now protected with PIN", 0).show();
}
addPin()함수를 분석하면 다음과 같은 정보를 알 수 있다.
- spedit 변수에 새로운 SharedPreferencs 에디터를 만들어 저장한다.
- 입력한 4자리 Pin 코드는 pin변수에 저장한다.
- putString(String key, String value) 함수를 통해 입력받은 Pin 코드를 설정한다.
- commit() 함수를 통해 변경된 사항을 커밋한다.
SharedPreference는 간편하게 정보를 저장하고 꺼내 쓰기 위해 사용한다.
- 실제로 /data/data/jakhar.aseem.diva/shared_prefs/jakhar.aseem.diva_preferences.xml 를 확인해보면 입력한 값을 확인할 수 있다.
goToNotes(), accessNotes()
public void goToNotes(View view) {
startActivity(new Intent(this, AccessControl3NotesActivity.class));
}
public class AccessControl3NotesActivity extends AppCompatActivity {
public void accessNotes(View view) {
EditText pinTxt = (EditText) findViewById(R.id.aci3notesPinText);
Button abutton = (Button) findViewById(R.id.aci3naccessbutton);
if (pinTxt.getText().toString().equals(PreferenceManager.getDefaultSharedPreferences(this).getString(getString(R.string.pkey), ""))) {
((ListView) findViewById(R.id.aci3nlistView)).setAdapter(new SimpleCursorAdapter(this, R.layout.notes_entry, getContentResolver().query(NotesProvider.CONTENT_URI, new String[]{"_id", "title", "note"}, (String) null, (String[]) null, (String) null), new String[]{"title", "note"}, new int[]{R.id.title_entry, R.id.note_entry}, 0));
pinTxt.setVisibility(4);
abutton.setVisibility(4);
return;
}
Toast.makeText(this, "Please Enter a valid pin!", 0).show();
}
}
goToNotes(), accessNotes() 함수를 분석하면 다음과 같다.
- goToNotes 함수를 통해 AccessControl3NotesActivity 액티비티를 생성한다.
- accessNotes() 함수에서 pinTxt 변수에 입력받은 Pin 코드를 저장한다(Private Notes를 접근하기 위해 입력받는 값).
- 입력받은 값과 이전에 SharedPreference를 사용하여 저장한 값을 비교한다.
- 만약 두 값이 같다면 notes 테이블의 값을 가져와 출력한다.
Exploit
중요 정보 암호화 미흡
accessNotes() 함수를 확인해보면 최종적으로 노트에 데이터는 DB 속 notes 테이블에 저장되어 있는 것을 알 수 있다.
먼저 db에 저장된 데이터를 확인하기 위해 해당 db 추출을 진행한다(db는 다음과 같이 /data/data/package/databases 경로에 위치한다).
adb pull을 사용하여 추출한 후 데이터 베이스를 확인해보면 다음과 같이 notes 테이블에 평문으로 저장된 데이터를 확인할 수 있다.
content 명령어를 사용한 데이터 확인
다음 명령어를 사용하여 notes 테이블에 저장된 데이터를 확인할 수 있다.
- adb shelll content query —uri "content uri"
Reference
- getDefaultSharedPreferences : https://developer.android.com/reference/android/preference/PreferenceManager#getDefaultSharedPreferences(android.content.Context)
- edit, getString : https://developer.android.com/reference/android/content/SharedPreferences#edit()
- putString, commit : https://developer.android.com/reference/android/content/SharedPreferences.Editor#commit()
'Android > Diva' 카테고리의 다른 글
Hardcoding Issues(Part 2) - Level 12 (0) | 2021.11.01 |
---|---|
Insecure Logging - Level 1 (0) | 2021.11.01 |