안녕하세요! 저번시간에는 모바일 취약점 연습용 어플 Diva 를 다운로드 설치했었습니다! 이번 시간에는 모바일 Diva 취약점중 하나인 '취약한 로깅' 취약점에 대하여 살펴보겠습니다!
'취약한 로깅' 이란?
> 모바일 앱 개발을 하면서 변수값이 잘들어가는지 , 어디서 오류가 나는지 확인하기위하여 Log.d 나 Log.e 를 자주 활용하게 됩니다. 하지만 개발 규모가 커지다 보면 이러한 디버깅했던 부분들을 미처 지우지 못하고 배포해버리는 경우가 종종 있습니다. 이럴경우 피해자의 시스템으로 접근시 앱의 로그를 살펴보면 '비밀번호 평문','아이디' 같은 중요정보가 평문으로 노출되어 있는경우가 있는데 이러한 취약점을 취약한 로깅 이라고 일컫습니다.
[실습]
1. 우선 모바일 Diva 어플을 실행시켜 주신 후 INSECURE LOGGIN으로 들어갑니다.
2. 문제 설명을 보니 '무엇이 로그되는지 확인하고 , 어디서 어떻게 취약한 코드가 있는지 확인하라' 입니다.
일단 어떤 동작을 하는지 입력란에다가 15880924 라고 적어봅시다!
3. 에러가 뜨는군요... 그러면 동작도 해보았으니 디컴파일러 Jadx를 통해 디컴파일링을 해봅시다.
4. Jadx로 저희가 다운로드 받은 Diva 파일을 열어줍니다.
5.보시면 LogActivity 파일의 코드에 저희가 15880924 를 입력하였을때 떳던 toast메세지에 대한 코드가 있습니다. 근데 저희가 입력한 변수는 cctxt 라는 EditText형 변수에 들어가는것으로 보이는데 , 이 값을 Log.e 를 통해서 diva-log 라는이름의 에러로, 값을 평문으로 로그에 저장하는것을 확인하실 수 있습니다!
↓ '취약한 로깅' 발생부분
(diva-log 라는 key값의 에러를 로그창에 기록하고있다)
6. 이 앱의 로그확인을 위하여 cmd 창을 켠후 다음의 명령어를 입력합니다. 보시면 저희가 입력한 credit card 비밀번호인 15880924 가 평문으로 로그기록에 저장되어 있는것을 확인하실 수 있습니다.
nox_adb shell "logcat | grep diva-log"
[왜 위험한가?]
>이를통해 시스템의 로그에 접근하는 것만으로도 비밀번호 정보를 탈취할 수 있고, 이 정보를 가지고 여러가지 비밀번호르 조합하여 브루트포스 공격을 통해 다른 앱이나 사이트에 가입된 계정을 탈취할 가능성이 존재하기 때문입니다.
[보안조치]
> 이는 디버깅 과정을 개발끝난이 이후에 지워야 하는데 그러지 않아서 발생한 문제점입니다. 또한 error 자체를 출력시키는건 괜찮은데 사용자가 입력한 값이 아무런 암호화도 없이 평문으로 저장된것이 문제점입니다. 따라서 로그에다가는 입력값을 저장 안하는것이 가장 좋은 해결책이고 , 만약 굳이 굳이 굳이! 꼭 로그로 입력값을 저장해야 겠다 한다면 다음과 같이 수정할 수 있습니다. 저장될 credit card number를 hash 암호화 하여 로그에 저장하는 것 입니다.
[만약 암호를 로그에 저장시 암호화 되어 저장되는 코드]
/* 원본 import 코드와 동일 */
import java.security.MessageDigest; //추가된 import
import java.security.NoSuchAlgorithmException; //추가된 import
public class LogActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_log);
}
public void checkout(View view) {
EditText cctxt = (EditText) findViewById(R.id.ccText);
try {
// cctxt의 평문값을 바이트 배열로 변환
byte[] data = cctxt.getText().toString().getBytes();
// SHA-256 해시 처리
MessageDigest hash = MessageDigest.getInstance("SHA-256");
byte[] value = hash.digest(data); // 해시 계산
// 해시값을 16진수 문자열로 변환
StringBuilder hexString = new StringBuilder();
for (byte b : value) {
hexString.append(String.format("%02x", b)); // 16진수로 포맷
}
// 해시값을 로그에 기록
Log.e("diva-log", "Error while processing transaction with credit card: " + hexString.toString());
Toast.makeText(this, "An error occurred. Please try again later", Toast.LENGTH_SHORT).show();
} catch (NoSuchAlgorithmException e) {
// 해시 알고리즘이 존재하지 않는 경우 처리
Log.e("diva-log", "Hashing algorithm not found", e);
Toast.makeText(this, "An error occurred. Please try again later", Toast.LENGTH_SHORT).show();
}
}
private void processCC(String ccstr) {
// 카드 처리 로직
throw new RuntimeException();
}
}
긴 글 읽어주셔서 감사합니다!
'모바일 앱해킹(Android) > Android DIVA' 카테고리의 다른 글
[Android DIVA] Input Validation Issues 취약점 (0) | 2024.11.03 |
---|---|
[Android DIVA] Insecure Data Storage 취약점 (0) | 2024.11.02 |
[Android DIVA] Hardcoding Issues 취약점 (0) | 2024.10.30 |
[Reversing] 디스어셈블러 툴 GHIDRA 설치방법 (0) | 2024.10.27 |
[Android DIVA] Android DIVA app 설치하기 (feat.jadx) (0) | 2024.10.26 |