이번 파트는~~~ 디바의 첫번째 문제 풀이다.

 

문제는 총 13개가 있다. 각 문제당 1개의 포스트로 할 것이며, 포스트 구성은 코드 분석, 취약점 테스트, 시큐어 코딩, 재배포 후 테스트 과정을 거칠거다. (네... 암요 해야죠 코드 분석.. 시큐어 코딩.. 하기 싫긴 하지만 먹고 살아야죠)

 

# 코드 분석

취약 모바일 앱 DIVA - 1 에서 정적 분석 준비를 끝냈다. 폴더를 열면 smali랑 sources가 있는데, sources가 smali 코드를 자바로 디컴파일(역변환)한 폴더이다. 가능하면 smali 코드는 안 볼 생각이다.. (내 뇌는 기계가 아니야...)

 

sources의 diva 디렉토리에 있는 MainActivity를 보자.

 

d1button(Insecure Logging 버튼)을 클릭하면 LogActivity 클래스를 호출해 실행한다.

    public void startChallenge(View view) {
        if (view == findViewById(R.id.d1button)) {
            Intent i = new Intent(this, (Class<?>) LogActivity.class);
            startActivity(i);
            return;
        }

 

LogActivity 파일을 보면 checkout(전달) 이벤트가 발생하고 에러가 발생하면  ccText(입력 박스)에 있는 값이 Log.e 함수를 통해 로그로 출력된다.

    public void checkout(View view) {
        EditText cctxt = (EditText) findViewById(R.id.ccText);
        try {
            processCC(cctxt.getText().toString());
        } catch (RuntimeException e) {
            Log.e("diva-log", "Error while processing transaction with credit card: " + cctxt.getText().toString());
            Toast.makeText(this, "An error occured. Please try again later", 0).show();
        }
    }

 

# 취약점 테스트

앱 실행 후 아무 넘버나 입력하고 Check Out 버튼을 클릭하자.

 

안드로이드 스튜디오에 logcat 기능이 있다. 이는 해당 디바이스에서 생성되는 모든 로그를 수집할 수 있는 도구이다. (adb 툴에서 제공) 해당 툴 실행 후 diva-log 를 필터하니 에러가 발생한 크레딧 카드 넘버가 출력된다.

 

정말 유감스럽게 이게 취약점이다.

 

만약에 이 로그가 따로 어디에 저장된다면 2차 공격이 가능하겠지만.. 솔직히 이걸로 무엇을 할 수 있을지 모르겠다.

 

왜냐하면 로그가 출력된다고 해도 악성앱이 설치돼서 로그에 접근할 수 있는 권한이 있는게 아니면 아무런 쓸모가 없기 때문이다.

 

다른 앱에 있는 로그는 함부러 접근하지 못한다. 지금은 USB 디버그 모드가 활성화되어 있기에 접근할 수 있지만, 이게 아니라면 애초에 접근조차 못한다는 말이다.

 

그렇다고 로그가 따로 어디에 저장되냐? 그것도 아니다. 로그는 메모리에 남아있고, 이 메모리 버퍼가 꽉차면 하나씩 지워지는 FILO 방식이다.

 

그럼에도 불구하고! 조치해야지.. 왜? 컴플라이언스에 걸리니까 그리고 어떤 취약점으로 연계될 지 모르니까!

 

# 시큐어 코딩

크레딧 카드 넘버가 로그로 출력되는게 문제였다. 크레딧 카드 넘버만 출력 안되게 만들면 된다.

    public void checkout(View view) {
        EditText cctxt = (EditText) findViewById(R.id.ccText);
        try {
            processCC(cctxt.getText().toString());
        } catch (RuntimeException e) {
            Log.e("diva-log", "Error while processing transaction with credit card");
            Toast.makeText(this, "An error occured. Please try again later", 0).show();
        }
    }

 

# 재배포

귀찮음... 한 번에 할게요

+ Recent posts