소프트웨어 개발보안 가이드 분석(2021) : 중요한 자원에 대한 잘못된 권한 설정

취약점에 대한 이해​

소프트웨어(SW)는 다양한 중요 보안 자원을 다루며, 이들 자원의 안전한 관리는 어플리케이션의 보안성을 좌우합니다. 하지만 SW가 설정 파일, 데이터베이스, 중요한 시스템 파일과 같은 보안 관련 자원에 대해 읽기 또는 수정 권한을 의도치 않게 넓게 부여하게 되면, 이는 심각한 보안 리스크를 야기합니다.

SW가 중요한 보안관련 자원에 대하여 읽기 또는 수정하기 권한을 의도하지 않게 허가할 경우, 권한을 갖지 않은 사용자가 해당 자원을 사용하게 된다.

이러한 오류로 인해 권한을 부여받지 않은 사용자나 악의적인 공격자가 해당 자원에 접근하여 사용하게 될 경우, 기밀성, 무결성, 가용성이라는 정보 보안의 핵심 원칙들이 침해될 위험이 있습니다. 따라서, 권한 설정은 매우 신중하게 이루어져야 하며, SW 개발 및 관리 과정에서의 철저한 보안 가이드라인 준수가 필수적입니다.

 

잘못된 권한 설정으로 인한 영향

중요한 자원에 대한 잘못된 권한 설정은 정보보안에 심각한 위협이 됩니다. 이러한 취약점은 비인가 사용자가 민감한 데이터에 접근하거나 시스템을 조작할 수 있는 길을 열어주며, 결과적으로 데이터 유출, 시스템 손상, 신뢰도 저하 등 다양한 형태의 보안 사고로 이어질 수 있습니다.

The DAO 해킹 사건은 중요한 자원에 대한 잘못된 권한 설정으로 인한 대표적인 사고 사례 중 하나입니다(HackingDistributed,2016).

데이터 유출

잘못된 권한 설정으로 인해 가장 흔히 발생하는 문제는 데이터 유출입니다. 민감한 정보가 포함된 파일이나 데이터베이스에 비인가 사용자가 접근할 수 있게 되면, 이는 조직의 명성과 고객의 신뢰를 심각하게 훼손시킬 수 있습니다. 예를 들어, 고객의 개인정보가 담긴 데이터베이스에 잘못된 권한이 설정되어 외부에 노출되는 경우, 이는 법적 책임과 함께 큰 경제적 손실을 초래할 수 있습니다.

시스템 손상

비인가 사용자가 중요한 시스템 파일이나 구성 설정에 접근하여 변경할 수 있다면, 이는 시스템의 안정성과 보안성을 직접적으로 위협합니다. 예를 들어, 시스템의 핵심 구성 파일의 권한이 잘못 설정되어 있으면, 공격자는 이를 수정하거나 삭제함으로써 전체 시스템을 마비시킬 수 있습니다.

신뢰도 저하

조직이 중요한 자원에 대한 권한을 잘못 설정하는 경우, 이는 해당 조직의 보안 관리 능력에 대한 의구심을 증가시킵니다. 고객이나 파트너 기업들은 보안 사고의 위험을 회피하기 위해 해당 조직과의 거래를 중단할 수도 있으며, 이는 장기적으로 조직의 사업 성공에 부정적인 영향을 미칩니다.

권한 설정에 관한 소프트웨어 개발보안가이드 분석

한국인터넷진흥원, 소프트웨어 개발보안가이드(2021)

개발보안가이드에 포함되어 있는 취약 사례는 파일 시스템 내의 "/home/setup/system.ini"라는 파일에 대한 권한 설정을 변경하는 예제입니다. 여기서 사용된 메소드들은 java.io.File 클래스의 일부로서 파일의 권한을 설정하는 데 사용됩니다.

개발보안가이드에 사용된 권한 설정 함수의 경우, 파라미터 개수에 따라 두 가지의 함수로 구분되므로 사용 시 충분한 이해가 필요합니다.

이 코드에서 두번째 파라미터(ownerOnly)가 false로 설정되어 있기 때문에, 이 파일에 대한 실행, 읽기, 쓰기 권한이 모든 사용자에게 부여되고 있습니다. 이는 보안상 좋지 않은 관행이며, 특히 중요한 시스템 파일인 경우 더욱 위험할 수 있습니다. 통상적으로 중요한 파일에는 최소한의 권한을 부여하고, 대부분의 경우 파일 소유자만 권한을 가지도록 설정하는 것이 안전합니다.

 

취약한 코드 예시와 시큐어 코딩 적용 사례

public class InsecureFilePermission {
    public static void main(String[] args) {
        try {
            // 중요한 정보를 담은 파일 생성
            String filePath = "/tmp/importantInfo.txt";
            File importantFile = new File(filePath);
            
            // 파일이 존재하지 않는 경우, 새로 생성
            if (!importantFile.exists()) {
                importantFile.createNewFile();
            }
            
            // 잘못된 권한 설정: 모든 사용자에게 읽기, 쓰기 권한 부여
            importantFile.setReadable(true, false);
            importantFile.setWritable(true, false);
            System.out.println("중요한 파일이 모든 사용자에게 열려 있습니다.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

위 코드에서는 /tmp/importantInfo.txt 파일에 대한 권한 설정이 잘못되어 있습니다. setReadablesetWritable 메소드의 두 번째 인자가 false로 설정되어 있어, 파일에 대한 읽기 및 쓰기 권한이 모든 사용자에게 부여됩니다. 이는 민감한 정보를 포함한 파일이 노출될 위험을 높입니다.

public class SecureFilePermission {
    public static void main(String[] args) {
        try {
            // 중요한 정보를 담은 파일 생성
            String filePath = "/tmp/importantInfo.txt";
            File importantFile = new File(filePath);
            
            // 파일이 존재하지 않는 경우, 새로 생성
            if (!importantFile.exists()) {
                importantFile.createNewFile();
            }
            
            // 안전한 권한 설정: 오직 소유자만 읽기, 쓰기 가능
            importantFile.setReadable(false, false);
            importantFile.setWritable(false, false);
            importantFile.setReadable(true, true);
            importantFile.setWritable(true, true);
            System.out.println("중요한 파일의 접근이 소유자에게만 제한됩니다.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

이 코드는 /tmp/importantInfo.txt 파일의 권한을 안전하게 설정합니다. 먼저 모든 사용자의 읽기 및 쓰기 권한을 제거하고, 파일의 소유자만이 읽고 쓸 수 있도록 설정함으로써 보안을 강화합니다.

 

Apache Hadoop API를 활용한 응용 코드 사례

import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.io.IOException;
import java.util.Set;

public class SecureFilePermissions {

    public static void setSecurePermissions(String filePath) {
        // Define the permissions that grant read, write, and execute to the owner only
        Set<PosixFilePermission> ownerOnlyPermissions = PosixFilePermissions.fromString("rwx------");

        try {
            // Apply the permissions to the file specified by filePath
            Files.setPosixFilePermissions(Paths.get(filePath), ownerOnlyPermissions);
            System.out.println("Permissions set to owner only for " + filePath);
        } catch (IOException e) {
            System.err.println("Unable to set file permissions for " + filePath + ": " + e.getMessage());
            // Handle exception according to your logging and error handling policy
        }
    }

    public static void main(String[] args) {
        if (args.length == 1) {
            setSecurePermissions(args[0]);
        } else {
            System.err.println("Usage: java SecureFilePermissions <file-path>");
        }
    }
}

이 자바 코드 예시는 파일에 대한 권한을 안전하게 설정합니다. PosixFilePermission을 사용하여 파일 소유자만 읽기, 쓰기, 실행이 가능하도록 권한을 설정하고 있습니다. setSecurePermissions 함수는 파일 경로를 받아 해당 파일에 대한 권한을 변경합니다. 만약 권한 설정에 실패한다면, 콘솔에 오류 메시지를 출력하고, 이는 로깅 및 오류 처리 정책에 따라 처리되어야 합니다. main 함수에서는 사용자가 파일 경로를 제공하면, 해당 파일에 대한 권한을 설정하는 방식으로 구성되어 있습니다.

  • 이전 소프트웨어 개발보안 가이드 분석(2021) : 부적절한 인가
  • 다음 소프트웨어 개발보안 가이드 분석(2021) : 취약한 암호화 알고리즘 사용