맞는데 왜 틀릴까..?

Java/Secure Coding 13

[Secure Coding] 안전하지 않거나 약한 암호 알고리즘을 사용하지 말라

보안에 민감한 응용프로그램들은 안전하지 않거나 약한 암호 함수를 피해야만 한다. DES (Data Encryption Standard) 암호 알고리즘은 매우 안전하지 않은 것으로 간주되는데, DES로 암호화된 메세지는 EFF Deep Crack과 같은 머신에 의해 하루 만에 무차별 대입 공격에 의해 복호화된다. 그럼 강한 암호 알고리즘을 간단하게 살펴보자. AES (Advanced Encryption Standard) AES는 다양한 키 길이를 지원하며 특히 256 비트 키 길이를 사용할 경우 높은 수준의 보안을 제공한다. 블록 암호화 방식으로 작동하며, 평문을 고정길이의 블록으로 나누어 암호화하고 복호화한다. Java Cryptography Extension 패키지를 사용하여 AES 암호화 및 복호화를..

Java/Secure Coding 2023.09.23

[Secure Coding] 암호키를 Object.equals()로 비교하지 말라

Object가 기본적으로 제공하는 equals() 메서드는 모든 객체에 대해 메모리 주소로 비교한다 사실 지금까지 객체가 동일한지가 아닌 객체의 내용이 동일한지 판단할 때 equals를 사용했었기 때문에 잠깐 혼동이 왔었는데 내가 여태 사용했던 것은 Object.equals를 오버라이딩한 String.equals였다. 오늘 아이템은 "Object.equals()로 비교하지 말자"이다. (메모리 주소로 비교하기 때문에) 📌 솔루션 Object.equals만 사용하지 않고 여러 단계를 거쳐 검증하는 equals 해당 코드는 3단계로 이루어져 있다. 1. 두 Key가 동일한지 비교 2. 두 Key 객체의 인코딩 된 값 비교 3. 두 Key 모두 RSAPrivateKey 인스턴스라면 모듈러스와 개인 지수 비교 ..

Java/Secure Coding 2023.09.17

[Secure Coding] 비신뢰-메서드의 매개변수를 clone() 메서드로 복제하지 말라

마침 Effective Java에서 관련된 주제를 다룬 적이 있어서 자세한 내용은 아래를 참조하자. https://com-squadleader.tistory.com/267 [Effective Java] Item 50. 적시에 방어적 복사본을 만들라 자바는 네이티브 메서드를 사용하지 않아 C, C++ 같이 안전하지 않은 언어에서 흔히 보는 버퍼 오버런, 배열 오버런, 와일드 포인터 같은 메모리 충돌 오류에서 안전하다. 자바로 작성한 클래스는 com-squadleader.tistory.com 가변적 메서드의 매개변수를 방어적으로 복사하면 다양한 보안 취약점을 완화시킨다. 그러나 clone() 메서드를 부적절하게 사용하면, 정상적으로 보이지만 예상하지 못한 결과를 반환하는 매개변수를 공격자에게 제공하게 되어 ..

Java/Secure Coding 2023.09.12

[Secure Coding] LDAP 인젝션을 방지하라

LDAP (Lightweight Directory Access Protocol)는 분산 디렉터리 서비스를 사용하여 정보를 저장하고 검색하기 위한 프로토콜 및 데이터 모델을 정의하는 업계 표준이다. LDAP는 주로 조직 내에서 데이터를 중앙 집중화하고 효율적으로 관리하기 위해 사용된다. LDAP의 데이터는 전통적인 관계형 데이터베이스와 다르게 저장된다. LDAP는 디렉터리 서비스를 위한 특별한 데이터 스토어를 사용하며, 이 데이터 스토어는 LDAP 프로토콜에 따라 디렉터리 엔트리 및 속성을 저장하고 검색하기 위한 목적으로 설계되었다. LDAP 데이터 스토어 LDAP 데이터 스토어는 계층적 트리 구조로 구성되며, 각 엔트리는 키-값 쌍의 속성(attribute)으로 정의되며 일반적으로 디렉터리 엔트리의 고유..

Java/Secure Coding 2023.09.09

[Secure Coding] XPath 인젝션을 방지하라

오늘 마침 학과 전공수업에서 데이터베이스 강의를 들었는데 이 강의를 듣지 않았으면 이해하지 못할 내용이었다. 굿 타이밍~ XML(Extensible Markup Language)은 관계형 데이터베이스와 유사한 방법으로 데이터를 저장하는 데 사용된다. XPath를 이용하여 이런 XML 문서로부터 데이터를 가져온다. 이러한 XPath 검색 루틴에게 제공하는 데이터를 적절하게 정제하지 않으면 XPath 인젝션이 발생할 수 있다. 공격자는 쿼리에 유효한 SQL이나 XML 구조를 입력할 수 있다. 전형적으로, 쿼리의 조건 필드가 항진명제로 해석되도록 하거나 그렇지 않으면 공격자로 하여금 권한이 필요한 정보를 엑세스할 수 있도록 한다. 부적절한 코드 - XML 패스 인젝션 아주 간단한 예제를 살펴보자 공격자의 입력..

Java/Secure Coding 2023.09.07

[Secure Coding] 코드 인젝션을 방지하라

코드 인젝션은 동적으로 구성되는 코드에 신뢰할 수 없는 입력이 삽입될 때 발생할 수 있다. 잠재적 취약점이 시작될 수 있는 확실한 한 가지 작업은 자바 코드에서 자바 스크립트를 사용하는 것이다. javax.script 패키지는 자바 스크립팅 엔진을 정의하는 인터페이스들과 클래스를 자바 코드에서 사용하기 위한 프레임워크로 구성되어 있다. javax.script API의 오용은 공격자로 하여금 대상 시스템에서 임의의 코드를 실행할 수 있도록 한다. 부적절한 코드 - javax.script API 오용 입력 값을 출력하는 자바스크립트로 신뢰할 수 없는 사용자 입력 삽입 해당 코드는 사용자로부터 JavaScript 코드를 입력받아서 실행한다. 신뢰할 수 없는 사용자 입력을 직접 실행하므로, 악의적인 사용자가 악..

Java/Secure Coding 2023.09.02

[Secure Coding] 출력을 적절하게 인코딩하거나 이스케이핑하라

적절한 입력 정제(sanitization)는 데이터베이스와 같은 서브시스템으로 악성 코드가 삽입되는 것을 방지할 수 있다. 데이터 출력을 목적으로 하는 여러 서브시스템 공격 HTML renderer는 출력을 디스플레이하기 위한 일반적인 시스템 중의 하나다. 출력 서브시스템으로 보내진 데이터는 신뢰할 수 있는 소스에서 온 것처럼 보일 수 있지만 출력 정제가 불필요하다고 가정하는 것은 위험하다. 이러한 데이터가 비신뢰-소스에서 시작되어 우회했을지도 모르고, 악의적인 내용을 포함할 수도 있기 때문이다. 출력 서브시스템으로 전달되는 데이터를 적절히 정제하지 못하면 여러 가지 형태의 공격을 허용하게 된다. HTML renderer는 HTML 인젝션과 XSS 공격을 당하기 쉽다. 이런 공격을 방지하기 위한 출력 정..

Java/Secure Coding 2023.08.11

[Secure Coding] 마구잡이 파일 업로드를 방지하라

웹 응용프로그램을 포함하여 파일 업로드를 허용하는 자바 응용프로그램들은 공격자가 악성 파일을 업로드하거나 전달할 수 없도록 보장해야 한다. 만약 코드를 포함한 제한되어야 할 파일이 대상 시스템에서 수행된다면, 응용계층의 방어책을 무력화시킬 수 있다. XSS 공격 HTML 파일을 업로드하도록 허용하는 응용프로그램은 악성 코드의 수행을 허용한다. 만약 출력에 대한 이스케이핑 루틴이 없을 경우에, 공격자는 크로스-사이트(XSS) 스크립팅 페이로드를 가지고 있는 HTML 파일을 보내서 공격을 수행할 수 있다. 공격 과정 1. HTML 파일 업로드 웹 응용프로그램이 사용자가 업로드한 HTML 파일을 저장하고, 다른 사용자들이 이 파일을 볼 수 있도록 한다. 이때 파일은 일반적인 텍스트 파일처럼 저장되는 것이 아니..

Java/Secure Coding 2023.08.07

[Secure Coding] 보안에 민감한 메서드들이 검증된 매개변수를 가지고 호출되도록 보장하라

보안에 민감한 메서드들을 호출하는 응용 코드는 메서드에게 전달되는 매개변수들을 검증해야만 한다. 어떤 보안에 민감한 메서드들에게는 null 값이 무난한 것으로 해석될 수도 있으나 디폴트 설정을 덮어쓸지도 모른다. 그렇게 되면 권한상승 또는 아무 코드나 수행할 수도 있게 된다. 부적절한 코드 - 보안에 민감한 메서드의 매개변수로 null을 사용 지금은 deprecated 되었지만 부적절한 코드 예를 한번 살펴보자. AccessController.doPrivileged 자바에서 특정 코드 블록을 보안 권한 검사를 우회하고 특권(privileged) 상태로 실행할 수 있는 메서드다. AccessController.doPrivileged( new PrivilegedAction(){ public Void run(..

Java/Secure Coding 2023.08.06

[Secure Coding] 민감한 가변적 클래스에 수정이 불가능한 래퍼를 제공하라

필드의 불변성(immutability)은 악의적인 변경뿐만 아니라 부주의로 인한 변경도 방지하여, 입력을 받아들이거나 값을 반환할 때 방어적인 복사가 불필요해진다. 그러나 일부 민감 클래스들은 불변성을 가질 수 없다. 만약 필드가 가변 객체라면 객체의 무결성을 위해 방어적 복사를 수행해야 한다. 부적절한 코드 - 내부 배열 객체의 수정을 허용 getter와 setter로 객체 내부 불변성 위협 비신뢰-호출자(untrusted invoker)는 setter를 호출하여 객체의 불변성을 위반 접근자 getter를 호출하여 Mutable의 내부 상태 수정 가능 가변적 private 클래스 멤버에 대한 레퍼런스를 반환하기 전에 멤버들을 복사하여 방어해야 한다. 솔루션 - 방어적 복사와 예외 발생 접근자 gette..

Java/Secure Coding 2023.08.04