효투의 세상 로딩중...
효투의 세상 로딩중...
반응형

메모리 내 중요정보 노출 취약점은 

앱에서 중요정보와 관련된 특정 행위 후 Memory Dump 도구를 사용해서

앱 메모리 덤프 시  

메모리에 적재되어있는 수많은 정보중 중요정보가 평문으로 적재되어 있을 경우 취약한 것으로 판단한다.

2022.04.28 - [모바일/Ios] - [ios] 프리다[Frida] Fridump를 이용한 메모리 덤프

 

[ios] 프리다[Frida] Fridump를 이용한 메모리 덤프

앱을 이용하면 메모리 내에 데이터들이 적재되는데 그 안에 중요정보들이 평문으로 담겨져있는 경우가 있다. (ex. 계정정보, 개인정보, 금융정보 등) 그래서 메모리 Dump를 통해 분석해볼 필요성

hyotwo.tistory.com

 

또한 아래처럼 메모리 덤프로 생성된 데이터에는

텍스트형식으로 이미지 파일도 적재되어있기 때문에 신분증이나 신용카드 사진과 같은 것도 원본형식으로 저장되면 안된다.

그럼 중요정보가 평문으로 적재가 되지않도록 시큐어코딩을 하면되는데,

크게 3가지 방법으로 개발자들에게 제시해주면 될 듯 하다.

1. 중요정보를 암호화하여 저장하는 방법

2. 중요정보가 사용된 후 날려도 되는 경우에 사용 후 삭제 처리하는 방법

3. 솔루션 도입

 

3번은 워낙 가불기라 어떤 취약점에든 다 들어간다

1번은 암호화하는 방법인데

예시 코드는 아래와 같다

public class SecurePassword {

    private static final char[] PASSWORD_CHARACTERS = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

    public static void main(String[] args) throws NoSuchAlgorithmException {
        // 비밀번호 입력
        Scanner scanner = new Scanner(System.in);
        System.out.print("비밀번호를 입력하세요: ");
        String password = scanner.nextLine();

        // 비밀번호를 암호화
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        byte[] hash = md.digest(password.getBytes());

        // 암호화된 비밀번호를 char 배열로 변환
        char[] encryptedPassword = new char[hash.length];
        for (int i = 0; i < hash.length; i++) {
            encryptedPassword[i] = (char) hash[i];
        }

        // 암호화된 비밀번호를 출력
        System.out.println("암호화된 비밀번호: " + new String(encryptedPassword));
    }
}

 

비밀번호가 암호화되어 메모리에 적재될 뿐 복호화된 평문 비밀번호는 적재되지 않는다.

 

2번 방법은 char 배열을 이용하여 

비밀번호가 사용된 직후 배열을 초기화해서 비워주는 방법이다.

class MainActivity : AppCompatActivity() {

    private lateinit var editText: EditText
    private lateinit var sharedPreferences: SharedPreferences

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        editText = findViewById(R.id.edit_text)
        sharedPreferences = getSharedPreferences("my_prefs", Context.MODE_PRIVATE)
    }

    fun onLoginClicked(view: View) {
        // 비밀번호를 입력
        val password = editText.text.toString()

        // 비밀번호를 char 배열로 변환
        val charArray = password.toCharArray()

        // 비밀번호를 초기화
        Arrays.fill(charArray, '\0')

        
        charArray = null
    }
}

 

위 코드에서는 Arrays.fill(charArray, '\0'); 가 핵심 부분이다.

비밀번호를 받고 char 배열로 변환했을 때 아직 메모리에 남아있지만

Arrays.fill(charArray, '\0'); 코드가 실행됨으로 써

배열이 null 값으로 채워진다. 즉 사용후 바로 비워버려서 메모리에 남지않게 되는 것이다.

 

 

반응형
  • hyotwo7658@gmail.com

복사 완료 👍