
[CVE-2022-41828] Amazon AWS Redshift JDBC ड्राइवर रिमोट कोड निष्पादन (RCE)
Amazon Redshift के लिए JDBC Driver एक टाइप 4 JDBC ड्राइवर है जो जावा प्लेटफॉर्म, एंटरप्राइज़ एडिशन में उपलब्ध मानक JDBC एप्लीकेशन प्रोग्राम इंटरफेस (APIs) के माध्यम से डेटाबेस कनेक्टिविटी प्रदान करता है। यह ड्राइवर किसी भी जावा एप्लीकेशन, एप्लीकेशन सर्वर, या जावा-सक्षम एपलेट से Redshift तक पहुँच प्रदान करता है।
redshift-jdbc42 के संस्करण 2.1.0.7 और उससे नीचे में एक संभावित दूरस्थ कमांड निष्पादन समस्या मौजूद है। जब ड्राइवर के साथ प्लगइन का उपयोग किया जाता है, तो यह sslhostnameverifier, socketFactory, sslfactory, और sslpasswordcallback कनेक्शन गुणों के माध्यम से प्रदान किए गए जावा क्लास नामों के आधार पर प्लगइन इंस्टेंस को इंस्टैंशिएट करता है। प्रभावित संस्करणों में, ड्राइवर इंस्टैंशिएशन से पहले यह सत्यापित नहीं करता है कि कोई प्लगइन क्लास अपेक्षित इंटरफ़ेस को लागू करता है या नहीं। इससे मनमाने जावा क्लासेस को लोड किया जा सकता है, जिसका उपयोग एक जानकार हमलावर, जिसके पास JDBC URL पर नियंत्रण है, दूरस्थ कोड निष्पादन प्राप्त करने के लिए कर सकता है।
यह समस्या redshift-jdbc-42 संस्करण 2.1.0.8 और उससे ऊपर में पैच की गई है।
AWS प्लगइन का उपयोग करने वाले ग्राहकों को redshift-jdbc42 संस्करण 2.1.0.8 या उससे ऊपर अपग्रेड करने की सलाह देता है। इस समस्या के लिए कोई ज्ञात वर्कअराउंड नहीं हैं।
इस समस्या को ठीक करने के लिए, कमिट aws/amazon-redshift-jdbc-driver@9999659 में 4 अलग-अलग जावा क्लासेस में संशोधन किए गए हैं। ये क्लासेस क्रमशः निम्नलिखित हैं।
@@ -38,7 +38,7 @@ public static SocketFactory getSocketFactory(Properties info) throws RedshiftExc
return SocketFactory.getDefault();
}
try {
//removed return (SocketFactory) ObjectFactory.instantiate(socketFactoryClassName, info, true, RedshiftProperty.SOCKET_FACTORY_ARG.get(info));
return ObjectFactory.instantiate(SocketFactory.class, socketFactoryClassName, info, true, RedshiftProperty.SOCKET_FACTORY_ARG.get(info)); //added
} catch (Exception e) {
throw new RedshiftException(
@@ -66,7 +66,7 @@ public static SSLSocketFactory getSslSocketFactory(Properties info) throws Redsh
if (classname.equals(RedshiftConnectionImpl.NON_VALIDATING_SSL_FACTORY))
classname = NonValidatingFactory.class.getName();
//removed return (SSLSocketFactory) ObjectFactory.instantiate(classname, info, true, RedshiftProperty.SSL_FACTORY_ARG.get(info));
return ObjectFactory.instantiate(SSLSocketFactory.class, classname, info, true, RedshiftProperty.SSL_FACTORY_ARG.get(info)); //added
} catch (Exception e) {
throw new RedshiftException(

@@ -61,7 +61,7 @@ private CallbackHandler getCallbackHandler(Properties info) throws RedshiftExcep
String sslpasswordcallback = RedshiftProperty.SSL_PASSWORD_CALLBACK.get(info);
if (sslpasswordcallback != null) {
try {
//removed cbh = (CallbackHandler) ObjectFactory.instantiate(sslpasswordcallback, info, false, null);
cbh = ObjectFactory.instantiate(CallbackHandler.class, sslpasswordcallback, info, false, null); //added
} catch (Exception e) {
throw new RedshiftException(
GT.tr("The password callback class provided {0} could not be instantiated.",

@@ -59,7 +59,7 @@ private static void verifyPeerName(RedshiftStream stream, Properties info, SSLSo
sslhostnameverifier = "RedshiftjdbcHostnameVerifier";
} else {
try {
//removed hvn = (HostnameVerifier) instantiate(sslhostnameverifier, info, false, null);
hvn = instantiate(HostnameVerifier.class, sslhostnameverifier, info, false, null); //added
} catch (Exception e) {
throw new RedshiftException(
GT.tr("The HostnameVerifier class provided {0} could not be instantiated.",

@@ -34,13 +34,13 @@ public class ObjectFactory {
* @throws IllegalAccessException if something goes wrong
* @throws InvocationTargetException if something goes wrong
*/
//removed public static Object instantiate(String classname, Properties info, boolean tryString,
public static <T> T instantiate(Class<T> expectedClass, String classname, Properties info, boolean tryString, //added
String stringarg) throws ClassNotFoundException, SecurityException, NoSuchMethodException,
IllegalArgumentException, InstantiationException, IllegalAccessException,
InvocationTargetException {
Object[] args = {info};
Constructor<?> ctor = null; //removed
Class<?> cls = Class.forName(classname); //removed
Constructor<? extends T> ctor = null; //added
Class<? extends T> cls = Class.forName(classname).asSubclass(expectedClass); //added
try {
ctor = cls.getConstructor(Properties.class);
} catch (NoSuchMethodException nsme) {

CVE-2022-41828 को पुनरुत्पादित करने के लिए, स्प्रिंग फ्रेमवर्क के साथ एक असुरक्षित जावा एप्लीकेशन विकसित किया गया है जो बाहरी लाइब्रेरी के रूप में एक असुरक्षित redshift-jdbc42 संस्करण 2.1.0.7 ड्राइवर का उपयोग करता है।