티스토리 뷰

728x90
반응형

[ 안드로이드 복사/붙여넣기 취약점 ]

          : 사용자가 개인 정보나 중요한 정보 복사할 때 클립보드에 저장된 임시 정보를

            별도의 권한 없이 허가되지 않은 사용자가 확인할 수 있기 때문에 발생하는 취약점

 

 

 

< Android Clipboard Framework >

- 안드로이드는 복사/붙여넣기 기능 위해 강력한 클립보드 기반의 프레임워크 지원

- 지원하는 데이터 종류 : TEXT, URI, Intent

- 클립보드는 한 번에 한 가지 클립 오브젝트만 저장하므로 새로운 클립 오브젝트로 정보 넣을 경우,

   이전 클립 오브젝트 정보는 사라짐

- 안드로이드 시스템에서 clipboard는 global clipboard class로도 표현

- clipboard manager 사용 위해 getSystemService() 메서드 사용

 

 

 

< GetSystemService(CLIPBOARD_SERVICE) >

- 데이터를 클립보드에 저장하기 위해서 ClipData 오브젝트에 데이터에 대한 설명과 실제 데이터를 함께 넣어야 함

- ClipData는 ClipDescription 오브젝트와 하나 이상의 ClipData.Item 오브젝트 추가한 후 ClipboardManager에 등록해 관리

 

 

 

* 복사 프로세스

클립보드 시스템을 얻어 옴

// 사용자가 복사를 선택할 경우
case R.id.menu_copy:

// clipboard 서비스를 얻어 옴
ClipboardManager clipboard = (ClipboardManger)
getSystemService (Context.CLIPBOARD_SERVICE);

// 클립보드에 새로운 텍스트 클립을 생성
ClipData clip = ClipData.newPlainText ("simple text", "Hello, World!");

// 클립보드에 첫 번째 클립을 지정
clipboard.setPrimaryClip();

- 복사 메뉴 선택했을 때 getSystemService로 클립보드 서비스 불러온 후 클립 데이터 생성

- 저장할 데이터 타입에 따라 각각 다른 메서드 사용

 

 

ClipData clip = ClipData.newPlainText(CharSequence label, CharSequence text)

- 텍스트 스트링 값을 가진 하나의 ClipData.Item 오브젝트를 포함하는 ClipData 오브젝트를 리턴

- 위 코드에서 ClipDescription 오브젝터의 라벨 값은 "Simple text", 데이터 타입값은 MI<ETYPE_TEXT_PLAIN 타입

 

 

 

* 붙여넣기 프로세스

ClipboardManger clipboard = (ClipboardManger)
getSystemService (Context.CLIPBOARD_SERVICE);

String pasteData = "";

- 텍스트를 붙여넣기 위해 global clipboard 서비스를 얻어 옴

- clip에 저장된 데이터 타입에 따라서 클립보드에 저장된 데이터가 텍스트 파일이 아닐 경우, 

   현재, Activity에서 붙여넣기 기능 활성화/비활성화 여부 정해야 함

 

 

데이터 타입에 따른 붙여넣기 기능 활성화 여부

// "붙여넣기" 메뉴의 ID 값을 얻어 옴
MenuItem mPasteItem = menu.findItem(R.id.memnu_paste);


// 만약 클립보드가 데이터 포함하지 않을 경우, 붙여넣기 메뉴 비활성화
// 만약 데이터 포함할 경우, 붙여넣기 메뉴 활성화

if (!(clipboard.hasPrimaryClip())) {

	mPasteItem.setEnabled(false);    
}
else if (!(clipboard.getPrimaryClipDescription().hasMimeType (MIMETYPE_TEXT_PLAIN)) {

	// 텍스트 파일 아닌 정보가 클립보드에 저장되어 있는 경우, 붙여넣기 메뉴 비활성화
    mPasteItem.setEnabled(false);
    }
else {
	
    // 텍스트 정보가 클립보드에 저장되어 있는 경우, 붙여넣기 메뉴 활성화
    mPasteItem.setEnabled(true);
}

- 사용자가 붙여넣기 메뉴 선택하면 클립보드에 첫 번째 값이 저장되어 있는지 확인

- 값이 저장되어 있으면 데이터 타입값 확인하기 위해 hasMimeType 클래스로 ClipDescription 오브젝트의 데이터

   타입값이 MIMETYPE_TEXT_PLAIN인지, 아닌지 확인 후 붙여넣기 메뉴 활성화

 

 

 

사용자가 붙여넣기 선택한 후 프로세스

// 사용자가 "붙여넣기 서낵한 후 프로세스
case R.id.menu_paste:

// 클립보드에 있는 item 검사. 만약 gettext() 함수가 'null' 반환하지 않으면 clip item에
// 텍스트가 저장되어 있는 것. 이 앱은 한 번에 하나의 item만 처리한다고 가정
ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);

// 클립보드 정보를 텍스트로 저장
pasteData = item.getText();

// 문자열 데이터 포함한 경우, 붙여넣기 작업 완료
if (pasteData != null) {
	return;
}

// 클립보드에 텍스트 정보 아닌 URI 정보 있을 경우,  URI 정보로부터 데이터 얻어오기 시도
else {
	Uri pasteUri = item.getUri();
    
    // 만약 URI에 텍스트 데이터 포함되어 있을 경우 데이터 추출 위한 조건문
    if (pasteUri != null) {
    	// URI에서 데이터 추출하는 루틴 호출하지만, 이 책에서 간단하게 표현됨
        pasteData = resolveUri(Uri);
        return;
    }
    else {
    	// MIME 타입이 일반 텍스트로 설정되어 있지만, 클립보드가 텍스트나 URI 아닌 경우나 
        // 문제가 있을 경우, 에러 발생
        Log.e("Clipboard contains an invalid data rype");
        return;
    }
}

- getText() 함수로, 클립보드 안의 item에 잇는 데이터 추출한 후 추출한 데이터 붙여넣는데 사용

 

 

 

 

 

 

< 취약점 진단 과정 >

 

 

 

 

 

 

 

728x90
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함