개발하시면서 보안이슈 때문에 여러가지 수단 방법 가리지 않고 다방면으로 애쓰고 계실텐데요


제가 지금 태클걸린게 메모리에 평문을 남기지 말라는 태클을 받았는데....


JAVA단에서 가능한 일인지 실험중입니다 -_-;



간략하게 정리를 죰 해보자면...



1. JAVA의 String객체는 immutable다 


Integer라던가 Double라던가 맨 앞이 대문자로 시작하는 기본(?)변수형들은 인스턴스를 생성하면서 상수화 하고 


String도 역시 immutable이며 한번 만들면 String pool에 던져놓는다. 랄까요?



2. 가베지 컬렉팅은 도움이 안된다.


메모리 해제는 잡아놓은 특정 주소를 더이상 사용 안한다~ 하고 선언해서 


다음에 메모리 잡을 때 그 부분도 수집해서 쓸 수 있게 할 뿐이지


메모리에 있는 값을 지우거나 초기화 하는 짓은 안합니다.


게다가 System.gc( ) ; 였던가요? 콜 해봐야 자바 머신에게 지금이 쓰래기 치우기에 적절한 시간이다! 라고 알릴 뿐이지


실제로 작업을 하는것도 아니죠



3. JAVA는 메모리를 접근 못하게 한다.


일단 C처럼 주소를 안다고 해서 마음대로 접근을 할 수가 없죠...


게다가 1번에 써놨듯 String는 JVM이 내부에서 캐싱하기 때문에 유저레벨에서 접근 불가능이 기본...




일단 String로 만들어지지 않고 처리할 수가 없는 상황인데 String으로 만들어 버리면 지울 수가 없는게 챰 문제죠


채팅방에 계신 존잘러 분들의 도움으로 아래와 같은 코드를 만들어 보았습니다.



	public static void main( String[] args ) 
	{
		try 
		{
			clearString( "pppop" ) ;
		}
		catch (Exception e) 
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void clearString( final String str ) throws Exception
	{
		System.out.println( str ) ;
		String str2 = new String( str ) ;
		Field sv = String.class.getDeclaredField( "value" ) ;
		sv.setAccessible( true ) ;
		char value[] = (char[]) sv.get( str2 ) ;
		for( int i = 0 ; i < value.length ; i++ )
		{
			value[i] = '*' ;
		}

		System.out.println( str ) ;

		String kkk = "Hello World" ; 

		char value2[] = (char[]) sv.get( kkk ) ;
		value2[0] = 'J' ;
		value2[1] = 'a' ;
		value2[2] = 'v' ;
		value2[3] = 'a' ;
		value2[4] = ' ' ;

		System.out.println( kkk ) ;
		System.out.println("Hello World");
	}


위 소스코드실행 결과로는 


pppop

*****

Java  World

Java  World


위와같이 나옵니다.


String pool에 존재하는 텍스트를 바꿔치기 해서 더미 데이터로 바꿔치기가 성공한 것 같습니다.




물론 문제점 있더군요


가장 큰 문제가 이겁니다 -_-;


예를 들자면 포트번호가 3306이라 가정했을때 3306이라는 String이 있는 상태인데...


사용자가 비밀번호를 3306으로 해놨을 경우 사용자가 입력한 3306이라는 텍스트 값을 더미로 교체하게 되면 


포트번호 3306이라는 스트링도 ****로 대처됩니다 -_-;



그리고 저 코드를 사용했을때도 우연히 다른 곳에서도 동일한 값을 사용하는건지 조사중인데 폰 메모리 전체를 뒤집어 까보면


문자열이 나오는 경우도 있습니다 -_-;;




역시 JNI를 써서 C단에서 처리하도록 다 뒤집어 까는 방법밖에 선택권이 없는걸까요.;


다른 분들은 어떻게 해결하실란가요??


profile

킈킈