소프트웨어 보안은 보안 소프트웨어가 아닙니다. 여기서는 인증, 액세스 제어, 기밀성, 암호화, 권한 관리 등의 항목에 대해 설명합니다.
...
DATA: lo_hmac TYPE Ref To cl_abap_hmac,
Input_string type string.
CALL METHOD cl_abap_hmac=>get_instance
EXPORTING
if_algorithm = 'SHA3'
if_key = space
RECEIVING
ro_object = lo_hmac.
" update HMAC with input
lo_hmac->update( if_data = input_string ).
" finalise hmac
lo_digest->final( ).
...
Example 1
에 표시된 코드는 성공적으로 실행될 수 있지만 코드에 접근할 수 있는 사용자는 빈 HMAC 키가 사용되고 있음을 알아낼 수 있습니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 빈 HMAC 키를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다. 또한 Example 1
의 코드는 forgery 및 key recovery 공격에 취약합니다.
...
using (HMAC hmac = HMAC.Create("HMACSHA512"))
{
string hmacKey = "";
byte[] keyBytes = Encoding.ASCII.GetBytes(hmacKey);
hmac.Key = keyBytes;
...
}
...
Example 1
의 코드는 성공적으로 실행될 수 있지만 코드에 접근할 수 있는 사용자는 빈 HMAC 키가 사용되고 있음을 알아낼 수 있습니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 빈 HMAC 키를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다. 또한 Example 1
의 코드는 forgery 및 key recovery 공격에 취약합니다.
import "crypto/hmac"
...
hmac.New(md5.New, []byte(""))
...
Example 1
의 코드는 성공적으로 실행될 수 있지만 코드에 접근할 수 있는 사용자는 빈 HMAC 키가 사용되고 있음을 확인할 수 있습니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 빈 HMAC 키를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다. 또한 Example 1
의 코드는 forgery 및 key recovery 공격에 취약합니다.
...
private static String hmacKey = "";
byte[] keyBytes = hmacKey.getBytes();
...
SecretKeySpec key = new SecretKeySpec(keyBytes, "SHA1");
Mac hmac = Mac.getInstance("HmacSHA1");
hmac.init(key);
...
Example 1
의 코드는 성공적으로 실행될 수 있지만 코드에 접근할 수 있는 사용자는 빈 HMAC 키가 사용되고 있음을 알아낼 수 있습니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 빈 HMAC 키를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다. 또한 Example 1
의 코드는 forgery 및 key recovery 공격에 취약합니다.
...
let hmacKey = "";
let hmac = crypto.createHmac("SHA256", hmacKey);
hmac.update(data);
...
예제 1
의 코드는 성공적으로 실행될 수 있지만 코드에 접근할 수 있는 사용자는 빈 HMAC 키가 사용되고 있음을 알아낼 수 있습니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 빈 HMAC 키를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다.
...
CCHmac(kCCHmacAlgSHA256, "", 0, plaintext, plaintextLen, &output);
...
Example 1
의 코드는 성공적으로 실행될 수 있지만 코드에 접근할 수 있는 사용자는 빈 HMAC 키가 사용되고 있음을 알아낼 수 있습니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 빈 HMAC 키를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다. 또한 Example 1
의 코드는 forgery 및 key recovery 공격에 취약합니다.
import hmac
...
mac = hmac.new("", plaintext).hexdigest()
...
Example 1
의 코드는 성공적으로 실행될 수 있지만 코드에 접근할 수 있는 사용자는 빈 HMAC 키가 사용되고 있음을 알아낼 수 있습니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 빈 HMAC 키를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다. 또한 Example 1
의 코드는 forgery 및 key recovery 공격에 취약합니다.
...
digest = OpenSSL::HMAC.digest('sha256', '', data)
...
Example 1
의 코드는 성공적으로 실행될 수 있지만 코드에 접근할 수 있는 사용자는 빈 HMAC 키가 사용되고 있음을 알아낼 수 있습니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 빈 HMAC 키를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다. 또한 Example 1
의 코드는 forgery 및 key recovery 공격에 취약합니다.
...
CCHmac(UInt32(kCCHmacAlgSHA256), "", 0, plaintext, plaintextLen, &output)
...
Example 1
의 코드는 성공적으로 실행될 수 있지만 코드에 접근할 수 있는 사용자는 빈 HMAC 키가 사용되고 있음을 알아낼 수 있습니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 빈 HMAC 키를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다. 또한 Example 1
의 코드는 forgery 및 key recovery 공격에 취약합니다.
...
Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes("", salt,100000);
...
...
var encryptor = new StrongPasswordEncryptor();
var encryptedPassword = encryptor.encryptPassword("");
...
const pbkdfPassword = "";
crypto.pbkdf2(
pbkdfPassword,
salt,
numIterations,
keyLen,
hashAlg,
function (err, derivedKey) { ... }
)
...
CCKeyDerivationPBKDF(kCCPBKDF2,
"",
0,
salt,
saltLen
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
...
CCKeyDerivationPBKDF(kCCPBKDF2,
password,
0,
salt,
saltLen
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
password
에 적절히 관리되는 강력한 암호 값이 포함되어 있더라도 해당 길이를 0으로 전달하여 값이 비거나, null
이거나, 예기치 않게 약한 암호 값을 생성하게 됩니다.
...
$zip = new ZipArchive();
$zip->open("test.zip", ZipArchive::CREATE);
$zip->setEncryptionIndex(0, ZipArchive::EM_AES_256, "");
...
from hashlib import pbkdf2_hmac
...
dk = pbkdf2_hmac('sha256', '', salt, 100000)
...
...
key = OpenSSL::PKCS5::pbkdf2_hmac('', salt, 100000, 256, 'SHA256')
...
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
"",
0,
salt,
saltLen,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
100000,
derivedKey,
derivedKeyLen)
...
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
password,
0,
salt,
saltLen,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
100000,
derivedKey,
derivedKeyLen)
...
password
에 적절히 관리되는 강력한 암호 값이 포함되어 있더라도 해당 길이를 0으로 전달하여 값이 비거나, null
이거나, 예기치 않게 약한 암호 값을 생성하게 됩니다.
...
encryptionKey = "lakdsljkalkjlksdfkl".
...
...
var encryptionKey:String = "lakdsljkalkjlksdfkl";
var key:ByteArray = Hex.toArray(Hex.fromString(encryptionKey));
...
var aes.ICipher = Crypto.getCipher("aes-cbc", key, padding);
...
...
Blob encKey = Blob.valueOf('YELLOW_SUBMARINE');
Blob encrypted = Crypto.encrypt('AES128', encKey, iv, input);
...
...
using (SymmetricAlgorithm algorithm = SymmetricAlgorithm.Create("AES"))
{
string encryptionKey = "lakdsljkalkjlksdfkl";
byte[] keyBytes = Encoding.ASCII.GetBytes(encryptionKey);
algorithm.Key = keyBytes;
...
}
...
char encryptionKey[] = "lakdsljkalkjlksdfkl";
...
...
<cfset encryptionKey = "lakdsljkalkjlksdfkl" />
<cfset encryptedMsg = encrypt(msg, encryptionKey, 'AES', 'Hex') />
...
...
key := []byte("lakdsljkalkjlksd");
block, err := aes.NewCipher(key)
...
...
private static final String encryptionKey = "lakdsljkalkjlksdfkl";
byte[] keyBytes = encryptionKey.getBytes();
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher encryptCipher = Cipher.getInstance("AES");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
...
...
var crypto = require('crypto');
var encryptionKey = "lakdsljkalkjlksdfkl";
var algorithm = 'aes-256-ctr';
var cipher = crypto.createCipher(algorithm, encryptionKey);
...
...
{
"username":"scott"
"password":"tiger"
}
...
...
NSString encryptionKey = "lakdsljkalkjlksdfkl";
...
...
$encryption_key = 'hardcoded_encryption_key';
//$filter = new Zend_Filter_Encrypt('hardcoded_encryption_key');
$filter = new Zend_Filter_Encrypt($encryption_key);
$filter->setVector('myIV');
$encrypted = $filter->filter('text_to_be_encrypted');
print $encrypted;
...
...
from Crypto.Ciphers import AES
encryption_key = b'_hardcoded__key_'
cipher = AES.new(encryption_key, AES.MODE_CFB, iv)
msg = iv + cipher.encrypt(b'Attack at dawn')
...
_hardcoded__key_
를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에서 암호화된 데이터에 침입할 수 있습니다.
require 'openssl'
...
encryption_key = 'hardcoded_encryption_key'
...
cipher = OpenSSL::Cipher::AES.new(256, 'GCM')
cipher.encrypt
...
cipher.key=encryption_key
...
예제 2: 다음 코드는 하드코드된 암호화 키를 사용하여 AES 암호화를 수행합니다.
...
let encryptionKey = "YELLOW_SUBMARINE"
...
...
CCCrypt(UInt32(kCCEncrypt),
UInt32(kCCAlgorithmAES128),
UInt32(kCCOptionPKCS7Padding),
"YELLOW_SUBMARINE",
16,
iv,
plaintext,
plaintext.length,
ciphertext.mutableBytes,
ciphertext.length,
&numBytesEncrypted)
...
...
-----BEGIN RSA PRIVATE KEY-----
MIICXwIBAAKBgQCtVacMo+w+TFOm0p8MlBWvwXtVRpF28V+o0RNPx5x/1TJTlKEl
...
DiJPJY2LNBQ7jS685mb6650JdvH8uQl6oeJ/aUmq63o2zOw=
-----END RSA PRIVATE KEY-----
...
...
Dim encryptionKey As String
Set encryptionKey = "lakdsljkalkjlksdfkl"
Dim AES As New System.Security.Cryptography.RijndaelManaged
On Error GoTo ErrorHandler
AES.Key = System.Text.Encoding.ASCII.GetBytes(encryptionKey)
...
Exit Sub
...
...
production:
secret_key_base: 0ab25e26286c4fb9f7335947994d83f19861354f19702b7bbb84e85310b287ba3cdc348f1f19c8cdc08a7c6c5ad2c20ad31ecda177d2c74aa2d48ec4a346c40e
...
...
DATA: lo_hmac TYPE Ref To cl_abap_hmac,
Input_string type string.
CALL METHOD cl_abap_hmac=>get_instance
EXPORTING
if_algorithm = 'SHA3'
if_key = 'secret_key'
RECEIVING
ro_object = lo_hmac.
" update HMAC with input
lo_hmac->update( if_data = input_string ).
" finalise hmac
lo_digest->final( ).
...
...
using (HMAC hmac = HMAC.Create("HMACSHA512"))
{
string hmacKey = "lakdsljkalkjlksdfkl";
byte[] keyBytes = Encoding.ASCII.GetBytes(hmacKey);
hmac.Key = keyBytes;
...
}
import "crypto/hmac"
...
hmac.New(sha256.New, []byte("secret"))
...
...
private static String hmacKey = "lakdsljkalkjlksdfkl";
byte[] keyBytes = hmacKey.getBytes();
...
SecretKeySpec key = new SecretKeySpec(keyBytes, "SHA1");
Mac hmac = Mac.getInstance("HmacSHA1");
hmac.init(key);
...
const hmacKey = "a secret";
const hmac = createHmac('sha256', hmacKey);
hmac.update(data);
...
hmacKey
를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다.
...
CCHmac(kCCHmacAlgSHA256, "secret", 6, plaintext, plaintextLen, &output);
...
import hmac
...
mac = hmac.new("secret", plaintext).hexdigest()
...
...
digest = OpenSSL::HMAC.digest('sha256', 'secret_key', data)
...
...
CCHmac(UInt32(kCCHmacAlgSHA256), "secret", 6, plaintext, plaintextLen, &output)
...
...
Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes("password", salt,100000);
...
...
var encryptor = new StrongPasswordEncryptor();
var encryptedPassword = encryptor.encryptPassword("password");
...
const pbkdfPassword = "a secret";
crypto.pbkdf2(
pbkdfPassword,
salt,
numIterations,
keyLen,
hashAlg,
function (err, derivedKey) { ... }
)
...
CCKeyDerivationPBKDF(kCCPBKDF2,
"secret",
6,
salt,
saltLen
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
...
$zip = new ZipArchive();
$zip->open("test.zip", ZipArchive::CREATE);
$zip->setEncryptionIndex(0, ZipArchive::EM_AES_256, "hardcodedpassword");
...
from hashlib import pbkdf2_hmac
...
dk = pbkdf2_hmac('sha256', 'password', salt, 100000)
...
...
key = OpenSSL::PKCS5::pbkdf2_hmac('password', salt, 100000, 256, 'SHA256')
...
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
"secret",
6,
salt,
saltLen,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
100000,
derivedKey,
derivedKeyLen)
...
Null
암호화 키는 쉽게 해결할 수 없는 방식으로 보안을 침해할 수 있습니다.null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어렵게 만들기 때문에 좋은 방법이 아닙니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키를 사용하여 AES 암호화를 수행합니다.
...
var encryptionKey:ByteArray = null;
...
var aes.ICipher = Crypto.getCipher("aes-cbc", encryptionKey, padding);
...
null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이라면 누구나 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 응용 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.Null
암호화 키는 쉽게 해결할 수 없는 방식으로 보안을 침해할 수 있습니다.null
암호화 키를 사용하는 것은 좋은 방법이 아닙니다. null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어려워집니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키를 사용합니다.
...
char encryptionKey[] = null;
...
null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이라면 누구나 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어렵게 만들기 때문에 좋은 방법이 아닙니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키를 사용하여 AES 암호화를 수행합니다.
...
aes.NewCipher(nil)
...
null
암호화 키가 사용되고 있음을 확인할 수 있습니다. 또한 기본적인 크랙 기법이라도 사용할 수 있는 사용자는 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 응용 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어렵게 만들기 때문에 좋은 방법이 아닙니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키를 사용하여 AES 암호화를 수행합니다.
...
SecretKeySpec key = null;
....
Cipher encryptCipher = Cipher.getInstance("AES");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
...
null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이라면 누구나 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 응용 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어렵게 만들기 때문에 좋은 방법이 아닙니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키를 사용하여 AES 암호화를 수행합니다.
...
var crypto = require('crypto');
var encryptionKey = null;
var algorithm = 'aes-256-ctr';
var cipher = crypto.createCipher(algorithm, encryptionKey);
...
null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이라면 누구나 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 응용 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어렵게 만들기 때문에 좋은 방법이 아닙니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키를 사용하여 AES 암호화를 수행합니다.
...
CCCrypt(kCCEncrypt,
kCCAlgorithmAES,
kCCOptionPKCS7Padding,
nil,
0,
iv,
plaintext,
sizeof(plaintext),
ciphertext,
sizeof(ciphertext),
&numBytesEncrypted);
...
null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이라면 누구나 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 응용 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.null
을 암호화 키 변수로 지정하는 것은 공격자에게 민감하고 암호화된 정보를 노출시킬 수 있으므로 잘못된 방법입니다. null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어려워집니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
로 초기화합니다.
...
$encryption_key = NULL;
$filter = new Zend_Filter_Encrypt($encryption_key);
$filter->setVector('myIV');
$encrypted = $filter->filter('text_to_be_encrypted');
print $encrypted;
...
null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이는 누구든지 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어렵게 만들기 때문에 좋은 방법이 아닙니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이라면 누구나 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 응용 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.None
을 암호화 키 변수로 지정하는 것은 공격자에게 민감하고 암호화된 정보를 노출시킬 수 있으므로 잘못된 방법입니다. null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어려워집니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
로 초기화합니다.
...
from Crypto.Ciphers import AES
cipher = AES.new(None, AES.MODE_CFB, iv)
msg = iv + cipher.encrypt(b'Attack at dawn')
...
null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이는 누구든지 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.null
암호화 키를 사용하는 것은 좋은 방법이 아닙니다. null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어려워집니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이는 누구든지 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.Null
암호화 키는 쉽게 해결할 수 없는 방식으로 보안을 침해할 수 있습니다.null
암호화 키를 사용하는 것은 좋은 방법이 아닙니다. null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어려워집니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키를 사용하여 AES 암호화를 수행합니다.
...
CCCrypt(UInt32(kCCEncrypt),
UInt32(kCCAlgorithmAES128),
UInt32(kCCOptionPKCS7Padding),
nil,
0,
iv,
plaintext,
plaintext.length,
ciphertext.mutableBytes,
ciphertext.length,
&numBytesEncrypted)
...
null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이라면 누구나 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어렵게 만들기 때문에 좋은 방법이 아닙니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키를 사용하여 AES 암호화를 수행합니다.
...
Dim encryptionKey As String
Set encryptionKey = vbNullString
Dim AES As New System.Security.Cryptography.RijndaelManaged
On Error GoTo ErrorHandler
AES.Key = System.Text.Encoding.ASCII.GetBytes(encryptionKey)
...
Exit Sub
...
null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이라면 누구나 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 응용 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.null
암호를 기반으로 암호화 키를 생성하여 사용하면 쉽게 해결할 수 없는 방식으로 시스템 보안을 손상시킬 수 있습니다.null
값을 전달하는 것은 좋은 방법이 아닙니다. 이 경우, 결과로 파생되는 키는 제공된 솔트만을 기반으로 하게 되어 크게 약해지며 문제를 해결하기도 극도로 어렵습니다. 잘못된 코드가 운영 단계에 들어간 후에는 소프트웨어 패치 없이는 null
암호를 변경할 수 없는 경우가 많습니다. null
비밀번호를 토대로 파생된 키를 통해 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택할 수밖에 없습니다.null
값을 전달합니다.
...
var encryptor = new StrongPasswordEncryptor();
var encryptedPassword = encryptor.encryptPassword(null);
...
null
암호 인수를 기반으로 하나 이상의 암호화 키가 생성된다는 것을 알아차릴 수 있을 뿐 아니라, 기본적인 크랙 기법이라도 사용할 수 있는 사용자는 누구든지 잘못된 키를 통해 보호되는 리소스에 성공적으로 접근할 수 있는 가능성이 매우 높습니다. 공격자가 null
암호를 기반으로 하는 키를 생성하는 데 사용되는 솔트 값에도 접근할 수 있는 경우 이러한 키를 크랙하는 것은 하찮은 일에 불과합니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 null
암호를 변경할 수 있습니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호의 사용 증거를 추출할 수 있습니다.null
암호를 기반으로 암호화 키를 생성하여 사용하면 쉽게 해결할 수 없는 방식으로 시스템 보안을 손상시킬 수 있습니다.null
값을 전달하는 것은 좋은 방법이 아닙니다. 이 경우, 결과로 파생되는 키는 제공된 솔트만을 기반으로 하게 되어 크게 약해지며 문제를 해결하기도 극도로 어렵습니다. 잘못된 코드가 운영 단계에 들어간 후에는 소프트웨어 패치 없이는 null
암호를 변경할 수 없는 경우가 많습니다. null
비밀번호를 토대로 파생된 키를 통해 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택할 수밖에 없습니다.null
값을 전달합니다.
...
CCKeyDerivationPBKDF(kCCPBKDF2,
nil,
0,
salt,
saltLen
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
null
암호 인수를 기반으로 하나 이상의 암호화 키가 생성된다는 것을 알아차릴 수 있을 뿐 아니라, 기본적인 크랙 기법이라도 사용할 수 있는 사용자는 누구든지 잘못된 키를 통해 보호되는 리소스에 성공적으로 접근할 수 있는 가능성이 매우 높습니다. 공격자가 null
암호를 기반으로 하는 키를 생성하는 데 사용되는 솔트 값에도 접근할 수 있는 경우 이러한 키를 크랙하는 것은 하찮은 일에 불과합니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 null
암호를 변경할 수 있습니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호의 사용 증거를 추출할 수 있습니다.null
암호를 기반으로 암호화 키를 생성하여 사용하면 쉽게 해결할 수 없는 방식으로 시스템 보안을 손상시킬 수 있습니다.null
값을 전달하는 것은 좋은 방법이 아닙니다. 이 경우, 결과로 파생되는 키는 제공된 솔트만을 기반으로 하게 되어 크게 약해지며 문제를 해결하기도 극도로 어렵습니다. 잘못된 코드가 운영 단계에 들어간 후에는 소프트웨어 패치 없이는 null
암호를 변경할 수 없는 경우가 많습니다. null
비밀번호를 토대로 파생된 키를 통해 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택할 수밖에 없습니다.null
값을 전달합니다.
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
nil,
0,
salt,
saltLen,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
100000,
derivedKey,
derivedKeyLen)
...
null
암호 인수를 기반으로 하나 이상의 암호화 키가 생성된다는 것을 알아차릴 수 있을 뿐 아니라, 기본적인 크랙 기법이라도 사용할 수 있는 사용자는 누구든지 잘못된 키를 통해 보호되는 리소스에 성공적으로 접근할 수 있는 가능성이 매우 높습니다. 공격자가 null
암호를 기반으로 하는 키를 생성하는 데 사용되는 솔트 값에도 접근할 수 있는 경우 이러한 키를 크랙하는 것은 하찮은 일에 불과합니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 null
암호를 변경할 수 있습니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호의 사용 증거를 추출할 수 있습니다.
from Crypto.PublicKey import RSA
key = RSA.generate(2048)
f = open('mykey.pem','w')
f.write(key.exportKey(format='PEM'))
f.close()
require 'openssl'
key = OpenSSL::PKey::RSA.new 2048
File.open('mykey.pem', 'w') do |file|
file.write(key.to_pem)
end
--profiling
플래그가 없거나 플래그가 true
로 설정되어 있습니다.iptables
에 대해 필요한 변경을 수행합니다. Kubelet 구성에서 makeIPTablesUtilChains
를 enabled:false
로 설정하면 Kubelet이 컨테이너와 나머지 요소 간의 네트워크 트래픽을 관리하는 것을 방지할 수 있습니다. 그러면 Kubelet이 필요한 네트워크 보안 요구 사항을 적용하지 못하고 컨테이너에서 요청한 연결을 설정하지 못하게 됩니다.makeIPTablesUtilChains: false
.설정으로 인해 Kubelet이 iptables
에 대해 필요한 변경을 수행하는 것을 방지합니다.
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
makeIPTablesUtilChains: false
--profiling
플래그가 없거나 플래그가 true
로 설정되어 있습니다.readOnlyRootFilesystem: false
설정은 이 제한을 비활성화하여 공격자가 로컬 파일 시스템을 조작하거나 악성 실행 파일을 디스크에 쓸 수 있도록 합니다.readOnlyRootFilesystem
필드를 false
로 설정하여 컨테이너 내부의 응용 프로그램이 로컬 디스크에 데이터를 쓰는 것을 허용합니다.
...
kind: Pod
...
spec:
containers:
- name: ...
...
securityContext:
readOnlyRootFilesystem: false
...
AlwaysPullImages
승인 컨트롤러는 이 우회를 방지할 수 있습니다.--enable-admission-plugins
플래그에 AlwaysPullImages
승인 컨트롤러 없이 Kubernetes API 서버를 시작합니다.
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=PodNodeSelector,LimitRanger
...
AlwaysAdmit
승인 컨트롤러가 활성화되었기 때문에 요청을 검증하지 않습니다.AlwaysAdmit
승인 컨트롤러를 사용하여 Kubernetes API 서버를 시작합니다.
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=AlwaysAdmit,PodSecurityPolicy
...
--client-cert-auth
플래그가 false
로 설정되어 있기 때문에 etcd 인스턴스는 신뢰할 수 있는 인증 기관에서 서명한 인증서가 없는 클라이언트의 연결을 수락합니다.--client-cert-auth
플래그를 false
로 설정합니다.
...
spec:
containers:
- command:
...
- etcd
...
--client-cert-auth=false
...
--kubelet-https
플래그가 false
로 설정되어 있으면 보안 통신이 비활성화됩니다.--kubelet-https
플래그가 false
로 설정되어 시작되기 때문에 API 서버와 Kubelets 간의 보안 통신을 비활성화합니다.
...
spec:
containers:
- command:
- kube-apiserver
- --kublet-https=false
- --authorization-mode=RBAC
image: example.domain/kube-apiserver-amd64:v1.6.0
...
--audit-log-maxage
플래그는 오래된 감사 로그 파일을 보관할 최대 일수를 정의합니다. Kubernetes API 서버를 시작하는 명령에 플래그가 없거나 보존 기간이 30일 미만으로 설정되어 있습니다.--audit-log-maxage
플래그를 2
(2일)로 설정하지만 이는 너무 짧습니다.
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --audit-log-maxage=2
...
--audit-log-maxbackup
플래그는 보존할 최대 로그 파일 수를 정의합니다. Kubernetes API 서버를 시작하는 명령에 이 플래그가 없거나 로그 파일의 최대 수가 10 미만입니다.--audit-log-maxbackup
플래그를 2
로 설정합니다. 이는 단 2개의 로그 파일만 보존하므로 충분하지 않습니다.
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --audit-log-maxbackup=2
...
--audit-log-maxsize
플래그는 자동으로 순환되기 전에 감사 로그 파일의 최대 크기를 메가바이트(MB) 단위로 설정합니다. Kubernetes API 서버를 시작하는 명령에 이 플래그가 없거나 감사 로그 파일의 최대 크기가 100MB 미만으로 설정되어 있습니다.--audit-log-maxsize
플래그를 2
(메가바이트)로 설정하지만 이걸로는 충분하지 않습니다.
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- ----audit-log-maxsize=2
...
ProtectKernelDefaults
설정을 설정하지 않은 상태로 두거나 false로 설정하면 Kubelet이 런타임에 커널 매개 변수를 수정할 수 있습니다. Kubernetes 배포 전에 커널 매개 변수를 최적화하고 강화해야 합니다. Kubelet에 커널 매개 변수를 변경할 수 있는 권한을 부여하면 호스트 운영 체제의 공격 표면이 확장됩니다.ProtectKernelDefaults: false
설정으로 인해 Kubelet이 커널 매개 변수를 구성하는 것을 허용합니다.
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
ProtectKernelDefaults: false