소프트웨어 보안은 보안 소프트웨어가 아닙니다. 여기서는 인증, 액세스 제어, 기밀성, 암호화, 권한 관리 등의 항목에 대해 설명합니다.
AUTHID
절이 없는 패키지는 기본값이 AUTHID DEFINER
가 됩니다.AUTHID DEFINER
또는 AUTHID CURRENT_USER
일 수 있습니다. 정의자의 권한이 있는 패키지의 함수 및 프로시저는 패키지를 정의하는 사용자의 권한 하에 실행됩니다. 그러면 전체 테이블 또는 스키마에 대한 접근을 허가하지 않고 데이터의 특정 부분에 대한 업데이트 및 접근을 허용할 수 있습니다. 호출자의 권한 또는 AUTHID CURRENT_USER
가 있는 패키지의 경우, 함수 및 프로시저는 호출하는 사용자의 권한 하에 실행됩니다. 이는 접근 권한이 없는 데이터에 사용자가 접근하지 못하도록 합니다. AUTHID
절이 제공되지 않은 경우, 패키지 기본값은 정의자의 권한이 됩니다. SYS
또는 다른 권한이 높은 사용자가 정의하며 코드의 익스플로이트를 잠재적으로 더 위험하게 만듭니다.<uses-permission/>
태그를 통해 AndroidManifest.xml
파일에 나열하여 설치 시 응용 프로그램에 의해 요청되어야 합니다. 필요한 권한이 요청되지 않으면 이러한 권한이 필요한 작업이 런타임 시 실패합니다. 경우에 따라 java.lang.SecurityException
이 응용 프로그램에 다시 발생됩니다. 다른 경우에는, 작업이 예외 없이 자동으로 실패합니다.sms.sendTextMessage(recipient, null, message, PendingIntent.getBroadcast(SmsMessaging.this, 0, new Intent(ACTION_SMS_SENT), 0), null);
android.permission.SEND_SMS
권한이 필요합니다. 이 권한이 매니페스트 파일에서 응용 프로그램에 의해 요청되지 않는 경우, 응용 프로그램은 SMS를 보내지 못합니다.<uses-permission/>
태그를 통해 AndroidManifest.xml
파일에 나열하여 설치 시 응용 프로그램에 의해 요청되어야 합니다. 필요한 권한이 요청되지 않으면 이러한 권한이 필요한 작업이 런타임 시 실패합니다. 경우에 따라 java.lang.SecurityException
이 응용 프로그램에 다시 발생됩니다. 다른 경우에는, 작업이 예외 없이 자동으로 실패합니다.Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
android.permission.READ_CONTACTS
권한이 필요합니다. 이 권한이 매니페스트 파일에서 응용 프로그램에 의해 요청되지 않는 경우, 응용 프로그램은 연락처 정보를 읽지 못합니다.<uses-permission/>
태그를 통해 AndroidManifest.xml
파일에 나열하여 설치 시 응용 프로그램에 의해 요청되어야 합니다. 필요한 권한이 요청되지 않으면 이러한 권한이 필요한 작업이 런타임 시 실패합니다. 경우에 따라 java.lang.SecurityException
이 응용 프로그램에 다시 발생됩니다. 다른 경우에는, 작업이 예외 없이 자동으로 실패합니다.android.provider.Telephony.SMS_RECEIVED
작업으로 인텐트를 전송합니다.
Intent i = new Intent("android.provider.Telephony.SMS_RECEIVED");
context.sendBroadcast(i);
android.permission.BROADCAST_SMS
권한이 필요합니다. 이 권한이 매니페스트 파일에서 응용 프로그램에 의해 요청되지 않는 경우, 응용 프로그램은 인텐트를 전송하지 못합니다.public
메서드의 권한 있는 코드는 JVM의 어디에서나 호출될 수 있습니다.public
접근 지정자를 가진 메서드는 임의의 외부 코드가 호출하도록 허용됨을 의미합니다. 권리 있는 작업을 수행하는 Public 메서드는 라이브러리나 코드가 동적으로 시스템에 들어갈 수 있는 환경에서 코드가 공유될 때 위험해질 수 있습니다(예: Code Injection, Dangerous File Inclusion, File Upload 등).doPrivilegedOpenFile()
은 public
으로 선언되며 권한 있는 작업을 수행합니다.
public static void doPrivilegedOpenFile(final String filePath) {
final BadFileNamePrivilegedAction pa = new BadFileNamePrivilegedAction(filePath);
FileInputStream fis = null;
...
fis = (FileInputStream)AccessController.doPrivileged(pa);
...
}
ALL PRIVILEGES
또는 ALL
옵션을 사용하면 사용자에게 개체에 대해 적용될 수 있는 모든 권한이 부여됩니다. 프로그래머가 부여된 권한을 모두 알지 못할 수도 있습니다.
GRANT ALL ON employees TO john_doe;
john_doe
에는 테이블의 정의를 변경할 수 있는 권한이 있습니다.true
를 사용하여 수동으로 콜백을 호출합니다.
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions$Callback callback){
super.onGeolocationPermissionsShowPrompt(origin, callback);
callback.invoke(origin, true, false);
}
ACTUATOR
역할을 가진 사용자만 액세스할 수 있도록 보호됩니다.
management.security.enabled=false
endpoints.health.sensitive=false
@Component
public class CustomEndpoint implements Endpoint<List<String>> {
public String getId() {
return "customEndpoint";
}
public boolean isEnabled() {
return true;
}
public boolean isSensitive() {
return false;
}
public List<String> invoke() {
// Custom logic to build the output
...
}
}
spring.application.admin.enabled
속성을 지정하여 응용 프로그램의 관리 관련 기능을 활성화할 수 있습니다. 이렇게 하면 MBeanServer
플랫폼에서 SpringApplicationAdminMXBean
이 노출됩니다. 개발자는 이 기능을 사용하여 원격으로 Spring Boot 응용 프로그램을 관리할 수 있지만 이 기능은 원격 JMX 끝점의 형태로 추가 공격 표면을 노출합니다. MBeanServer
의 구성에 따라 MBean
은 로컬 또는 원격으로 노출될 수 있으며 인증을 요구하거나 요구하지 않을 수 있습니다. 최악의 경우 공격자는 인증 없이 응용 프로그램을 종료하는 것을 포함하여 원격으로 응용 프로그램을 관리할 수 있습니다. 최상의 경우 서비스는 서버를 보호하는 데 사용되는 자격 증명만큼 강력해집니다.spring-boot-devtools
를 활성화하는 것은 보안 위험입니다. 운영 배포에서는 지원을 활성화하면 안 됩니다."
endpoints.shutdown.enabled=true
<http auto-config="true">
...
<intercept-url pattern="/app/admin" access="ROLE_ADMIN" />
<intercept-url pattern="/**" access="permitAll" />
</http>
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
<http auto-config="true">
...
<headers disabled="true"/>
...
</http>
Ant
경로 식으로 끝점 보호 방법을 지정했습니다./admin
" Ant
경로 식과 일치하는 모든 끝점에 액세스하려면 관리자 권한이 있어야 합니다.
<http auto-config="true">
...
<intercept-url pattern="/app/admin" access="ROLE_ADMIN" />
...
<intercept-url pattern="/**" access="permitAll" />
</http>
Accept
헤더를 사용하거나, 확장자를 통해 원하는 콘텐트 유형을 지정하여 리소스를 원하는 방식으로 지정할 수 있습니다. 예를 들어 /admin.json
으로 요청을 보내 /admin
리소스를 JSON 문서로 요청할 수 있습니다.Ant
경로 식은 콘텐트 협상 확장을 설명하지 않으므로 요청이 /admin
식과 일치하지 않고 끝점이 보호되지 않습니다.anyRequest()
. anyRequest()
선택기를 사용하는 폴백 검사를 정의하지 못하면 끝점이 보호되지 않을 수 있습니다.
<http auto-config="true">
<intercept-url pattern="/app/admin" access="ROLE_ADMIN" />
<intercept-url pattern="/" access="permitAll" />
</http>
Example 1
에서 현재 또는 미래의 끝점(예: /admin/panel
)이 보호되지 않을 수 있습니다.HttpFirewall
을 FilterChainProxy
에 포함하여 해당 요청을 정화할 수 있으며, 필터 체인을 통해 요청을 보내기 전에 처리합니다. Spring Security는 기본적으로 StrictHttpFirewall
구현을 사용합니다.%2F
및 ;
문자를 허용합니다.
<beans:bean id="httpFirewall" class="org.springframework.security.web.firewall.StrictHttpFirewall" p:allowSemicolon="true" p:allowUrlEncodedSlash="true"/>
NoneAuth
인증 메서드를 사용하여 사용 가능한 인증 메서드를 결정합니다.
client = SSHClient()
client.connect(host, port, auth_strategy=NoneAuth("user"))
remove
명령을 사용하여 전체 데이터 집합을 삭제할 수 있습니다. 최근 인터넷에서 공개 실행 중인 보안되지 않은 MongoDB 인스턴스에 대한 악성 공격에 대한 보고가 있었습니다. 공격자는 데이터베이스를 지운 후 피해자에게 데이터베이스 복원을 위한 보상금을 지불할 것을 요구했습니다.remove
명령을 사용하여 전체 데이터 집합을 삭제할 수 있습니다. 최근 인터넷에서 공개 실행 중인 보안되지 않은 MongoDB 인스턴스에 대한 악성 공격에 대한 보고가 있었습니다. 공격자는 데이터베이스를 지운 후 피해자에게 데이터베이스 복원을 위한 보상금을 지불할 것을 요구했습니다.