Android/Diva

Access Control Issues(Part 3) - Level 11

앱 정보

  • level11은 비밀 노트 애플리케이션으로 4자리 숫자의 PIN 코드를 설정한 후 노트를 확인할 때 설정한 코드를 인증하여 비밀 노트를 확인할 수 있는 애플리케이션이다.

기본 화면은 다음과 같으며, 4자리 PIN 코드를 입력할 수 있는 칸과 PIN 코드 입력 후 생성/변경할 수 있는 버튼 그리고 비밀 노트로 이동하는 버튼으로 구성되어 있다.

[그림 1] Level 11 기본 구성

 

비밀 노트로 이동하기 이전에 PIN 코드 입력 후 생성/변경 버튼을 눌러준다.

[그림 2] PIN 코드 생성

 

이동하면 PIN 코드를 입력할 수 있는 칸과 비밀 노트에 접속하는 버튼으로 구성되어 있으며, 이전에 설정한 코드를 입력한 후 버튼을 눌러 노트에 접속해준다.

[그림 3] 생성한 PIN 코드 입력

 

이동하면 다음과 같은 정보를 확인할 수 있다.

[그림 4] 비밀 노트 확인

 

앱 분석

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 를 확인해보면 입력한 값을 확인할 수 있다.

[그림 5] 저장된 PIN 코드 확인

 

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 경로에 위치한다).

[그림 6] 데이터 베이스 확인

 

adb pull을 사용하여 추출한 후 데이터 베이스를 확인해보면 다음과 같이 notes 테이블에 평문으로 저장된 데이터를 확인할 수 있다.

[그림 7] 데이터 베이스 내 중요 정보 확인

 

content 명령어를 사용한 데이터 확인

다음 명령어를 사용하여 notes 테이블에 저장된 데이터를 확인할 수 있다.

  • adb shelll content query —uri "content uri"

[그림 8] content를 사용하여 데이터베이스 내 중요 정보 확인

 

Reference

'Android > Diva' 카테고리의 다른 글

Hardcoding Issues(Part 2) - Level 12  (0) 2021.11.01
Insecure Logging - Level 1  (0) 2021.11.01