<p>قد يقوم kubeadm بتسجيل رموز التمهيد المميزة قبل محاولة حذفها</p>

تم إنشاؤها على ١١ سبتمبر ٢٠٢٠  ·  3تعليقات  ·  مصدر: kubernetes/kubeadm

ما هي الكلمات الرئيسية التي بحثت عنها في قضايا kubeadm قبل تقديم هذا؟

token ، error

هل هذا تقرير خطأ أم طلب ميزة؟

_تقرير أمني

ملخص:

يأخذ الأمر kubeadm 's delete كإدخال إما معرف رمز تمهيد التشغيل أو رمز مميز كامل. قبل تحديد ما إذا كان الإدخال مجرد معرف أو رمز ممتلئ ، يقوم kubeadm بتسجيل الإدخال باستخدام klog . إذا فشل الحذف ، سيظل الرمز المميز صالحًا. يمكن للمهاجم الذي لديه حق الوصول إلى السجلات استخدامه لتنفيذ الإجراءات التي تتطلب رمز تمهيد التشغيل ، مثل إنشاء مجموعة أو الانضمام إلى العقد في نظام مجموعة موجود.

إصدار Kubernetes:

الكود الضعيف موجود في kubernetes 1.19. تم تعديل السطر المحدد الذي يحتوي على الاستدعاء لـ klog آخر مرة في 2019-03-24.

تفاصيل:

الكود الضعيف موجود في المستودع github.com/kubernetes ، في الملف kubernetes/cmd/kubeadm/app/cmd/token.go ، في السطر 423. ها هي الوظيفة بأكملها:

// RunDeleteTokens removes a bootstrap tokens from the server.
func RunDeleteTokens(out io.Writer, client clientset.Interface, tokenIDsOrTokens []string) error {
    for _, tokenIDOrToken := range tokenIDsOrTokens {
        // Assume this is a token id and try to parse it
        tokenID := tokenIDOrToken
        klog.V(1).Infof("[token] parsing token %q", tokenIDOrToken) // POTENTIAL LEAK HERE
        if !bootstraputil.IsValidBootstrapTokenID(tokenIDOrToken) {
            // Okay, the full token with both id and secret was probably passed. Parse it and extract the ID only
            bts, err := kubeadmapiv1beta2.NewBootstrapTokenString(tokenIDOrToken)
            if err != nil {
                return errors.Errorf("given token %q didn't match pattern %q or %q",
                    tokenIDOrToken, bootstrapapi.BootstrapTokenIDPattern, bootstrapapi.BootstrapTokenIDPattern)
            }
            tokenID = bts.ID
        }

        tokenSecretName := bootstraputil.BootstrapTokenSecretName(tokenID)
        klog.V(1).Infof("[token] deleting token %q", tokenID)
        if err := client.CoreV1().Secrets(metav1.NamespaceSystem).Delete(context.TODO(), tokenSecretName, metav1.DeleteOptions{}); err != nil {
            return errors.Wrapf(err, "failed to delete bootstrap token %q", tokenID)
        }
        fmt.Fprintf(out, "bootstrap token %q deleted\n", tokenID)
    }
    return nil
}

وإليك تعريف الأمر kubeadm الذي يستدعي هذه الوظيفة (في نفس الملف):

    deleteCmd := &cobra.Command{
        Use:                   "delete [token-value] ...",
        DisableFlagsInUseLine: true,
        Short:                 "Delete bootstrap tokens on the server",
        Long: dedent.Dedent(`
            This command will delete a list of bootstrap tokens for you.

            The [token-value] is the full Token of the form "[a-z0-9]{6}.[a-z0-9]{16}" or the
            Token ID of the form "[a-z0-9]{6}" to delete.
        `),
        RunE: func(tokenCmd *cobra.Command, args []string) error {
            if len(args) < 1 {
                return errors.Errorf("missing subcommand; 'token delete' is missing token of form %q", bootstrapapi.BootstrapTokenIDPattern)
            }
            kubeConfigFile = cmdutil.GetKubeConfigPath(kubeConfigFile)
            client, err := getClientset(kubeConfigFile, dryRun)
            if err != nil {
                return err
            }

            return RunDeleteTokens(out, client, args)
        },
    }

تأثير:

يمكن للمهاجم الذي يحصل على رمز تمهيد التشغيل من السجلات استخدامه للمصادقة مع kubeadm وإنشاء مجموعة جديدة أو ضم العقد إلى مجموعة موجودة ، على سبيل المثال لاستخدام موارد الحوسبة. يمكن للمهاجم أيضًا تنفيذ إجراءات أخرى باستخدام kubeadm ، على سبيل المثال إدراج أو حذف الرموز المميزة الأخرى.

معلومة اضافية:

لقد أبلغت HackerOne عن هذه الثغرة الأمنية وإصلاحه علنًا.

لقد فتحت علاقات عامة على kubernetes تنفذ إصلاحًا: https://github.com/kubernetes/kubernetes/pull/94727

aresecurity kincleanup prioritbacklog

ال 3 كومينتر

يأخذ أمر حذف kubeadm كمدخل إما معرف رمز تمهيد أو رمز مميز كامل. قبل تحديد ما إذا كان الإدخال مجرد معرف أم رمز مميز كامل ، يقوم kubeadm بتسجيل الإدخال باستخدام klog. إذا فشل الحذف ، سيظل الرمز المميز صالحًا. يمكن للمهاجم الذي لديه حق الوصول إلى السجلات استخدامه لتنفيذ الإجراءات التي تتطلب رمز تمهيد التشغيل ، مثل إنشاء مجموعة أو الانضمام إلى العقد في نظام مجموعة موجود.

مرحبًا ، وشكرًا لتسجيل المشكلة. لتكون قادرًا على قراءة مثل هذه السجلات ، سيحتاج المرء إلى الامتيازات الصحيحة وأفترض أن السجلات ستكون إما تحت الوصول إلى الجذر أو تُمنح لمجموعة معينة لديها وصول أعلى من الرموز المميزة للتمهيد بالفعل.

أيضا:

  • يجب تمكين --v=>1 أثناء تنفيذ kubeadm token delete إذا كان الرمز المميز بتنسيق صالح
  • تنتهي صلاحية الرموز المميزة بعد 24 ساعة بشكل افتراضي

أعتقد أن التحسن في العلاقات العامة جيد في الغالب ، لكن لا أعتقد أنه يجب علينا الرجوع إلى الإصدارات الأقدم (<1.20) نظرًا لتعقيد مثل هذا الهجوم.

أتفق مع @ neolit123 على عدم استخدام backport (ما لم تكن هناك احتياجات محددة حقًا)
WRT للإصلاح ، أنا +1 لإزالة TokenID من السجلات

يتم الإغلاق عند دمج https://github.com/kubernetes/kubernetes/pull/94727 .
شكرا

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات