token
، error
_تقرير أمني
يأخذ الأمر kubeadm
's delete
كإدخال إما معرف رمز تمهيد التشغيل أو رمز مميز كامل. قبل تحديد ما إذا كان الإدخال مجرد معرف أو رمز ممتلئ ، يقوم kubeadm
بتسجيل الإدخال باستخدام klog
. إذا فشل الحذف ، سيظل الرمز المميز صالحًا. يمكن للمهاجم الذي لديه حق الوصول إلى السجلات استخدامه لتنفيذ الإجراءات التي تتطلب رمز تمهيد التشغيل ، مثل إنشاء مجموعة أو الانضمام إلى العقد في نظام مجموعة موجود.
الكود الضعيف موجود في 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
يأخذ أمر حذف kubeadm كمدخل إما معرف رمز تمهيد أو رمز مميز كامل. قبل تحديد ما إذا كان الإدخال مجرد معرف أم رمز مميز كامل ، يقوم kubeadm بتسجيل الإدخال باستخدام klog. إذا فشل الحذف ، سيظل الرمز المميز صالحًا. يمكن للمهاجم الذي لديه حق الوصول إلى السجلات استخدامه لتنفيذ الإجراءات التي تتطلب رمز تمهيد التشغيل ، مثل إنشاء مجموعة أو الانضمام إلى العقد في نظام مجموعة موجود.
مرحبًا ، وشكرًا لتسجيل المشكلة. لتكون قادرًا على قراءة مثل هذه السجلات ، سيحتاج المرء إلى الامتيازات الصحيحة وأفترض أن السجلات ستكون إما تحت الوصول إلى الجذر أو تُمنح لمجموعة معينة لديها وصول أعلى من الرموز المميزة للتمهيد بالفعل.
أيضا:
--v=>1
أثناء تنفيذ kubeadm token delete
إذا كان الرمز المميز بتنسيق صالحأعتقد أن التحسن في العلاقات العامة جيد في الغالب ، لكن لا أعتقد أنه يجب علينا الرجوع إلى الإصدارات الأقدم (<1.20) نظرًا لتعقيد مثل هذا الهجوم.
أتفق مع @ neolit123 على عدم استخدام backport (ما لم تكن هناك احتياجات محددة حقًا)
WRT للإصلاح ، أنا +1 لإزالة TokenID من السجلات
يتم الإغلاق عند دمج https://github.com/kubernetes/kubernetes/pull/94727 .
شكرا