ekg insecure temporary file creation and arbitrary code execution

ZATAZ Audits <[email protected]>
Newsgroups gmane.comp.security.vulnerabilities.watch.announce
Organization ZATAZ Audits
Message-ID <42CA2DDB.5030606__14393.8966132284$1120577328$gmane$org@zataz.net>
#########################################################

ekg insecure temporary file creation and arbitrary code execution

Vendor: http://dev.null.pl/ekg/
Advisory: http://www.zataz.net/adviso/ekg-06062005.txt
Vendor informed: yes
Exploit available: no
Impact : high
Exploitation : high

#########################################################

The vulnerabilities are caused due to temporary file being created 
insecurely.
This can be exploited via symlink attacks in combination  to create and 
overwrite
arbitrary files with the privileges of the user running the affected 
script and
also arbitrary command possible by spiking the temporary file.

##########
Versions:
##########

ekg <= 2005-06-05 22:03

##########
Solution:
##########

For the symlink attack use kernel patch such as grsecurity

#########
Timeline:
#########

Discovered : 2005-05-27
Vendor notified : 2005-06-06
Vendor response : no response
Vendor fix : no fix
Vendor Sec report ([email protected]) : 2005-06-27
Disclosure : 2005-07-04

#####################
Technical details :
#####################

Vulnerable code :
-----------------

In contrib/scripts/linki.py

95 def czyjest ():
96     if os.path.exists('/tmp/rmrmg_ekg_url'):
97         wejsc= open ('/tmp/rmrmg_ekg_url')
98         file = wejsc.readlines()
99         dlug=len(file)
100         wejsc.close()
101         #ekg.printf("generic", "liczno¶æ %d" %(dlug))
102         return file
103     else:
104         return 0

Then

35 def handle_keypress(meta, key):
36     if key == 269:
37         ekg.printf("generic", "wci¶nieto F5")
38         nurl=czyjest()
39         if nurl == 0:
40             ekg.printf("generic", "nie ma zadnego adresu URL")
41         else:
42             dlug=len(nurl)
43             if dlug == 1:
44                 ekg.printf("generic", "otwieram %s w nowej zak³adce" 
%(nurl[0]))
45                 os.system("MozillaFirebird -remote 
'openURL(%s,new-tab)'" %(nurl[0]))
46                 os.system('rm /tmp/rmrmg_ekg_url')
47             else:
48                 ekg.printf("generic", "linków mam %d" %(dlug))
49                 wielejest(nurl)
50                 ekg.printf("generic", "otwieram %s w nowej zak³adce" 
%(nurl[0]))
51                 os.system("MozillaFirebird -remote 'openURL(%s, 
new-tab)'" %(nurl[0]))
52     elif key == 270:
53         ekg.printf("generic", "wcisniêto F6")
54         nurl=czyjest()
55         if nurl == 0:
56             ekg.printf("generic", "nic nie moge skasowaæ - nie 
mazadnego adresu URL")
57         else:
58             dlug=len(nurl)
59             if dlug == 1:
60                 ekg.printf("generic", "kasuje adres %s" %(nurl[0])) 

61                 os.system('rm /tmp/rmrmg_ekg_url')
62             else:
63                 ekg.printf("generic", "jest wiele linków")
64                 wielejest(nurl)
65                 ekg.printf("generic", "kasuje pierwszy czyli: 
%s"%(nurl[0]))
66     elif key == 271:
67         ekg.printf("generic", "wcisniêto F7")
68         nurl=czyjest()
69         if nurl == 0:
70             ekg.printf("generic", "nie ma zadnego adresu URL")
71         else:
72             dlug=len(nurl)
73             if dlug == 1:
74                 ekg.printf("generic", "otwieram %s w nowym 
oknie"%(nurl[0]))
75                 os.system("MozillaFirebird %s" %(nurl[0]))
76                 os.system('rm /tmp/rmrmg_ekg_url')
77             else:
78                 ekg.printf("generic", "linków mam %d" %(dlug))
79                 wielejest(nurl)
80                 ekg.printf("generic", "otwieram %s w nowym 
oknie"%(nurl[0]))
81     elif key == 272:
82         ekg.printf("generic", "wcisniêto F8")
83         nurl=czyjest()
84         ekg.printf("generic", "F5 - otwiera w nowej zak³adce; F7 
wnowym oknie, a F6 kasuje, wszystko tyczy siê pierwszej po        zycji 
zlisty")
85         if nurl == 0:
86             ekg.printf("generic", "nie ma zadnego adresu URL")
87         else:
88             dlug=len(nurl)
89             ekg.printf("generic", "linków mam %d oto one:" %(dlug))
90             for po in nurl:
91                 ekg.printf("generic", "%s" %(po))
92     return 1

#########
Related :
#########

Gentoo Bugs report : http://bugs.gentoo.org/show_bug.cgi?id=94172
CVE : CAN-2005-1916

#####################
Credits :
#####################

Eric Romang ([email protected] - ZATAZ Audit)
Thxs to Gentoo Security Team. (Taviso, jaervosz, solar, tigger, etc.)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.