Skip to content

Commit

Permalink
feat: 新增QLExpress表达式注入检测时判断sendbox和白名单配置
Browse files Browse the repository at this point in the history
  • Loading branch information
UzJu committed Oct 24, 2023
1 parent 0bd0d5f commit df5314d
Showing 1 changed file with 25 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.List;
import java.util.Set;

/**
* @author UzJu
Expand Down Expand Up @@ -36,29 +37,43 @@ public boolean match(MethodEvent event, SinkNode sinkNode) {
@Override
public boolean isSafe(MethodEvent event, SinkNode sinkNode){
/**
* Die QLExpress-Komponente bietet die Konfigurationsfunktion forbidInvokeSecurityRiskMethods, um die Erkennung von schwarzen Listen zu ermöglichen. Daher muss zusätzlich zur Bestimmung des Senkenpunkts auch festgestellt werden, ob der Benutzer diese Konfiguration aktiviert hat.
* Wenn diese Konfiguration aktiviert ist, werden Sie beim Aufruf einer auf der schwarzen Liste stehenden Klasse aufgefordert: com.ql.util.express.exception.QLSecurityRiskException: Eine unsichere Systemmethode wurde mit QLExpress aufgerufen: public java.lang.Process java. lang.Runtime.exec(java.lang.String) throws java.io.IOException
* The QLExpress component provides the forbidInvokeSecurityRiskMethods configuration function to enable blacklist detection. Therefore, in addition to determining the sink point, you must also determine if the user has this configuration enabled.
* If this configuration is enabled, you will be prompted when calling a blacklisted class: com.ql.util.express.exception.QLSecurityRiskException: An unsafe system method was called using QLExpress: public java.lang.Process java. lang.Runtime.exec(java.lang.String) throws java.io.IOException
* */
DongTaiLog.debug("Start der Ermittlung, ob das Feld forbidInvokeSecurityRiskMethods der QLExpress-Komponente wahr ist oder nicht");
DongTaiLog.debug("Start determining whether the forbidInvokeSecurityRiskMethods field of the QLExpress component is true or not.");
try {
Class<?> cls;
if (QL_CLASS_LOADER == null){
cls = Class.forName(" com.ql.util.express.config.QLExpressRunStrategy".substring(1));
}else {
cls = Class.forName(" com.ql.util.express.config.QLExpressRunStrategy".substring(1), false, QL_CLASS_LOADER);
}
Field field = cls.getDeclaredField("forbidInvokeSecurityRiskMethods");
if (Modifier.isStatic(field.getModifiers()) && Modifier.isPrivate(field.getModifiers())) {
field.setAccessible(true);
boolean value = field.getBoolean(null);
DongTaiLog.debug("forbidInvokeSecurityRiskMethods = " + value);
return value;

Field getBlackListField = cls.getDeclaredField("forbidInvokeSecurityRiskMethods");
Field getSendBoxModeField = cls.getDeclaredField("sandboxMode");
Field getWhiteListField = cls.getDeclaredField("SECURE_METHOD_LIST");

if (Modifier.isStatic(getBlackListField.getModifiers()) && Modifier.isPrivate(getBlackListField.getModifiers()) && Modifier.isStatic(getSendBoxModeField.getModifiers()) && Modifier.isPrivate(getSendBoxModeField.getModifiers()) && Modifier.isStatic(getWhiteListField.getModifiers()) && Modifier.isPrivate(getWhiteListField.getModifiers())) {
// Make private fields accessible to reflection
getBlackListField.setAccessible(true);
getSendBoxModeField.setAccessible(true);
getWhiteListField.setAccessible(true);

// get fields value
boolean blackListBoolean = getBlackListField.getBoolean(null);
boolean sendBoxBoolean = getSendBoxModeField.getBoolean(null);
Set<String> secureMethodList = (Set<String>) getWhiteListField.get(null);
DongTaiLog.debug("SECURE_METHOD_LIST = " + secureMethodList);
DongTaiLog.debug("sandboxMode = " + sendBoxBoolean);
DongTaiLog.debug("forbidInvokeSecurityRiskMethods = " + blackListBoolean);
// All three conditions need to be met
return (secureMethodList != null && !secureMethodList.isEmpty()) || sendBoxBoolean || blackListBoolean;
} else {
DongTaiLog.debug("Field is not static and private.");
return true;
}
}catch (Throwable e){
DongTaiLog.debug("Beim Abrufen der Felder der QLExpress-Komponente ist ein Fehler aufgetreten.: {}, {}",
DongTaiLog.debug("An error occurred while retrieving the fields of the QLExpress component.: {}, {}",
e.getClass().getName() + ": " + e.getMessage(),
e.getCause() != null ? e.getCause().getMessage() : "");
return true;
Expand Down

0 comments on commit df5314d

Please sign in to comment.