EgovProperties.java 무결성 검사없는 코드 다운로드(Properties) 해결 방법좀 알려주세요.
- 작성자 :
- 장*
- 작성일 :
- 2016-05-21 17:05:31
- 조회수 :
- 2,993
- 구분 :
- 기타
- 진행상태 :
- 완료
Q
EgovProperties.java 파일 소스 일부분입니다.
자세한 소스는 첨부파일을 확인해주세요.
=================================================
Properties props = new Properties();
fis = new FileInputStream(EgovWebUtil.filePathBlackList(fileName));
props.load(new java.io.BufferedInputStream(fis));
=================================================
개요
원격으로부터 소스코드 또는 실행파일을 무결성 검사 없이 다운로드 받고, 이를 실행하는 제품들이 종종 존재합니다.
이는 호스트 서버의 변조, DNS 스푸핑(Spoofing) 또는 전송시의 코드 변조 등의 방법을 이용하여 공격자가 악의적인 코드를 실행할 수 있도록 합니다.
카테고리
CWE-494 : Download of Code Without Integrity Check
탐지근거
프로퍼티로 읽은 입력 값을 통해 적절한 검증없이 시스템의 임의파일을 다운로드 받을 경우를 탐지합니다.
취약한 코드
private static Properties bad(String filename)
{
Properties properties = new Properties();
try {
if (!fileexist()) {
System.out.println('no file");
} else {
// 보안약점
properties.load(new FileInputStream(filename));
}
}
//...
}
위와 같이 웹취약점 분석을 하면 검출이 됍니다.
아무리 수정을 해봐도 해결이 안돼네요~
해결 방법좀 알려 주세요.
자세한 소스는 첨부파일을 확인해주세요.
=================================================
Properties props = new Properties();
fis = new FileInputStream(EgovWebUtil.filePathBlackList(fileName));
props.load(new java.io.BufferedInputStream(fis));
=================================================
개요
원격으로부터 소스코드 또는 실행파일을 무결성 검사 없이 다운로드 받고, 이를 실행하는 제품들이 종종 존재합니다.
이는 호스트 서버의 변조, DNS 스푸핑(Spoofing) 또는 전송시의 코드 변조 등의 방법을 이용하여 공격자가 악의적인 코드를 실행할 수 있도록 합니다.
카테고리
CWE-494 : Download of Code Without Integrity Check
탐지근거
프로퍼티로 읽은 입력 값을 통해 적절한 검증없이 시스템의 임의파일을 다운로드 받을 경우를 탐지합니다.
취약한 코드
private static Properties bad(String filename)
{
Properties properties = new Properties();
try {
if (!fileexist()) {
System.out.println('no file");
} else {
// 보안약점
properties.load(new FileInputStream(filename));
}
}
//...
}
위와 같이 웹취약점 분석을 하면 검출이 됍니다.
아무리 수정을 해봐도 해결이 안돼네요~
해결 방법좀 알려 주세요.
A
안녕하세요. 표준프레임워크센터입니다.
일반적으로 "무결성 검사 없는 코드 다운로드 취약점"의 경우 다운로드 대상 파일에 대해 무결성 검사를 하는 로직을 추가하여 해결하는 방향으로 처리합니다.
올려주신 내용을 확인한 결과 properties파일을 load하는 부분을 검출한 것으로 판단되기에, 해당 부분에 무결성 검사를 하는 로직을 추가하여 파일의 변조 유무를 체크하는 방법으로 진행해보시기 바랍니다.
※ 다만 저희에게 사용하신 점검툴이 존재하지 않고, 정책상 센터 차원의 커스터마이징에 대한 가이드는 제공하지 않기 때문에 별도의 작업 및 검증테스트는 필요할 것 같습니다.
무결성 검사의 경우 여러가지 방법 중 파일해시 값을 검증하는 방법에 대한 간략한 예시를 가이드 해드리니 참고만 해보시기 바랍니다.
1. 소스내에 파일의 해시값을 산출하는 메소드를 생성하고 이를 통해 properties파일의 해시값을 미리 산출
2. EgovProperties.getProperty() 메소드 내에 properties파일을 load 전에 해시값을 산출하고, 미리 산출한 값과 비교하는 로직을 통해 load 실행여부 제어
ref 1)
public static String getHashFile(String targetfile, String algorithm) throws Exception {
String rtn ="";
FileInputStream inputStream = null;
try{
MessageDigest digest = MessageDigest.getInstance(algorithm);
inputStream = new FileInputStream(targetfile);
byte[] bytesBuffer = new byte[1024];
int bytesRead = -1;
while ((bytesRead = inputStream.read(bytesBuffer)) != -1) {
digest.update(bytesBuffer, 0, bytesRead);
}
byte[] hashedBytes = digest.digest();
//convert the byte to hex format
StringBuffer sb = new StringBuffer("");
for (int i = 0; i < hashedBytes.length; i++) {
sb.append(Integer.toString((hashedBytes[i] & 0xff) + 0x100, 16).substring(1));
}
LOGGER.debug("getHashFile Digest(in hex format):: " + sb.toString());
rtn = sb.toString();
} catch (Exception ex) {
LOGGER.debug("getHashFile Exception", ex);
throw new RuntimeException(ex);
}finally{
EgovResourceCloseHelper.close(inputStream);//inputStream.close(); > EgovResourceCloseHelper.close()
}
return rtn;
}
ref 2)
public static String getProperty(String keyName) {
//...
Properties props = new Properties();
String targetFile = EgovWebUtil.filePathBlackList(GLOBALS_PROPERTIES_FILE);
//targetFile get hash value, Algorithm : MD5
String getHash = getHashFile(targetFile, "MD5");
//targetFile checksum compare props.checksum
if(getHash.equals("2287de52c220c523047156c87226fe61")){
fis = new FileInputStream(targetFile);
props.load(new BufferedInputStream(fis));
if (props.getProperty(keyName) == null) {
return "";
}
value = props.getProperty(keyName).trim();
}
//...
http://stackoverflow.com/questions/304268/getting-a-files-md5-checksum-in-java
http://reiphiel.tistory.com/entry/about-security-file-hash-checksum
감사합니다.
일반적으로 "무결성 검사 없는 코드 다운로드 취약점"의 경우 다운로드 대상 파일에 대해 무결성 검사를 하는 로직을 추가하여 해결하는 방향으로 처리합니다.
올려주신 내용을 확인한 결과 properties파일을 load하는 부분을 검출한 것으로 판단되기에, 해당 부분에 무결성 검사를 하는 로직을 추가하여 파일의 변조 유무를 체크하는 방법으로 진행해보시기 바랍니다.
※ 다만 저희에게 사용하신 점검툴이 존재하지 않고, 정책상 센터 차원의 커스터마이징에 대한 가이드는 제공하지 않기 때문에 별도의 작업 및 검증테스트는 필요할 것 같습니다.
무결성 검사의 경우 여러가지 방법 중 파일해시 값을 검증하는 방법에 대한 간략한 예시를 가이드 해드리니 참고만 해보시기 바랍니다.
1. 소스내에 파일의 해시값을 산출하는 메소드를 생성하고 이를 통해 properties파일의 해시값을 미리 산출
2. EgovProperties.getProperty() 메소드 내에 properties파일을 load 전에 해시값을 산출하고, 미리 산출한 값과 비교하는 로직을 통해 load 실행여부 제어
ref 1)
public static String getHashFile(String targetfile, String algorithm) throws Exception {
String rtn ="";
FileInputStream inputStream = null;
try{
MessageDigest digest = MessageDigest.getInstance(algorithm);
inputStream = new FileInputStream(targetfile);
byte[] bytesBuffer = new byte[1024];
int bytesRead = -1;
while ((bytesRead = inputStream.read(bytesBuffer)) != -1) {
digest.update(bytesBuffer, 0, bytesRead);
}
byte[] hashedBytes = digest.digest();
//convert the byte to hex format
StringBuffer sb = new StringBuffer("");
for (int i = 0; i < hashedBytes.length; i++) {
sb.append(Integer.toString((hashedBytes[i] & 0xff) + 0x100, 16).substring(1));
}
LOGGER.debug("getHashFile Digest(in hex format):: " + sb.toString());
rtn = sb.toString();
} catch (Exception ex) {
LOGGER.debug("getHashFile Exception", ex);
throw new RuntimeException(ex);
}finally{
EgovResourceCloseHelper.close(inputStream);//inputStream.close(); > EgovResourceCloseHelper.close()
}
return rtn;
}
ref 2)
public static String getProperty(String keyName) {
//...
Properties props = new Properties();
String targetFile = EgovWebUtil.filePathBlackList(GLOBALS_PROPERTIES_FILE);
//targetFile get hash value, Algorithm : MD5
String getHash = getHashFile(targetFile, "MD5");
//targetFile checksum compare props.checksum
if(getHash.equals("2287de52c220c523047156c87226fe61")){
fis = new FileInputStream(targetFile);
props.load(new BufferedInputStream(fis));
if (props.getProperty(keyName) == null) {
return "";
}
value = props.getProperty(keyName).trim();
}
//...
http://stackoverflow.com/questions/304268/getting-a-files-md5-checksum-in-java
http://reiphiel.tistory.com/entry/about-security-file-hash-checksum
감사합니다.