Merge lp:~sergiusens/snapcraft/1503495 into lp:~snappy-dev/snapcraft/core

Proposed by Sergio Schvezov
Status: Merged
Approved by: John Lenton
Approved revision: 235
Merged at revision: 235
Proposed branch: lp:~sergiusens/snapcraft/1503495
Merge into: lp:~snappy-dev/snapcraft/core
Diff against target: 139 lines (+58/-24)
2 files modified
snapcraft/repo.py (+15/-2)
snapcraft/tests/test_repo.py (+43/-22)
To merge this branch: bzr merge lp:~sergiusens/snapcraft/1503495
Reviewer Review Type Date Requested Status
John Lenton (community) Approve
Review via email: mp+274031@code.launchpad.net

Commit message

Removing suid/guid bits from extracted debs

To post a comment you must log in.
lp:~sergiusens/snapcraft/1503495 updated
235. By Sergio Schvezov

Removing suid/guid bits from extracted debs

Revision history for this message
John Lenton (chipaca) wrote :

Yes.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'snapcraft/repo.py'
2--- snapcraft/repo.py 2015-10-08 19:25:43 +0000
3+++ snapcraft/repo.py 2015-10-09 21:50:28 +0000
4@@ -22,6 +22,7 @@
5 import platform
6 import string
7 import shutil
8+import stat
9 import subprocess
10 import urllib
11 import urllib.request
12@@ -133,7 +134,7 @@
13 except subprocess.CalledProcessError:
14 raise UnpackError(pkg)
15
16- _fix_symlinks(rootdir)
17+ _fix_contents(rootdir)
18
19 def _manifest_dep_names(self):
20 manifest_dep_names = set()
21@@ -223,11 +224,14 @@
22 return apt_cache, progress
23
24
25-def _fix_symlinks(debdir):
26+def _fix_contents(debdir):
27 '''
28 Sometimes debs will contain absolute symlinks (e.g. if the relative
29 path would go all the way to root, they just do absolute). We can't
30 have that, so instead clean those absolute symlinks.
31+
32+ Some unpacked items will also contain suid binaries which we do not want in
33+ the resulting snap.
34 '''
35 for root, dirs, files in os.walk(debdir):
36 # Symlinks to directories will be in dirs, while symlinks to
37@@ -244,6 +248,15 @@
38 continue
39 os.remove(path)
40 os.symlink(os.path.relpath(target, root), path)
41+ elif os.path.exists(path):
42+ _fix_filemode(path)
43+
44+
45+def _fix_filemode(path):
46+ mode = stat.S_IMODE(os.stat(path).st_mode)
47+ if mode & 0o4000 or mode & 0o2000:
48+ logger.debug('Removing suid/guid from {}'.format(path))
49+ os.chmod(path, mode & 0o1777)
50
51
52 _skip_list = None
53
54=== modified file 'snapcraft/tests/test_repo.py'
55--- snapcraft/tests/test_repo.py 2015-10-08 19:25:43 +0000
56+++ snapcraft/tests/test_repo.py 2015-10-09 21:50:28 +0000
57@@ -17,6 +17,7 @@
58 import fixtures
59 import logging
60 import os
61+import stat
62 import tempfile
63 import unittest.mock
64
65@@ -26,6 +27,14 @@
66
67 class UbuntuTestCase(tests.TestCase):
68
69+ def setUp(self):
70+ super().setUp()
71+ fake_logger = fixtures.FakeLogger(level=logging.ERROR)
72+ self.useFixture(fake_logger)
73+ tempdirObj = tempfile.TemporaryDirectory()
74+ self.addCleanup(tempdirObj.cleanup)
75+ self.tempdir = tempdirObj.name
76+
77 @unittest.mock.patch('snapcraft.repo._get_geoip_country_code_prefix')
78 def test_sources_amd64_vivid(self, mock_cc):
79 mock_cc.return_value = 'ar'
80@@ -66,25 +75,37 @@
81 self.assertFalse(mock_cc.called)
82
83 def test_fix_symlinks(self):
84- fake_logger = fixtures.FakeLogger(level=logging.ERROR)
85- self.useFixture(fake_logger)
86- tempdirObj = tempfile.TemporaryDirectory()
87- self.addCleanup(tempdirObj.cleanup)
88- tempdir = tempdirObj.name
89-
90- os.makedirs(tempdir + '/a')
91- open(tempdir + '/1', mode='w').close()
92-
93- os.symlink('a', tempdir + '/rel-to-a')
94- os.symlink('/a', tempdir + '/abs-to-a')
95- os.symlink('/b', tempdir + '/abs-to-b')
96- os.symlink('1', tempdir + '/rel-to-1')
97- os.symlink('/1', tempdir + '/abs-to-1')
98-
99- repo._fix_symlinks(debdir=tempdir)
100-
101- self.assertEqual(os.readlink(tempdir + '/rel-to-a'), 'a')
102- self.assertEqual(os.readlink(tempdir + '/abs-to-a'), 'a')
103- self.assertEqual(os.readlink(tempdir + '/abs-to-b'), '/b')
104- self.assertEqual(os.readlink(tempdir + '/rel-to-1'), '1')
105- self.assertEqual(os.readlink(tempdir + '/abs-to-1'), '1')
106+ os.makedirs(self.tempdir + '/a')
107+ open(self.tempdir + '/1', mode='w').close()
108+
109+ os.symlink('a', self.tempdir + '/rel-to-a')
110+ os.symlink('/a', self.tempdir + '/abs-to-a')
111+ os.symlink('/b', self.tempdir + '/abs-to-b')
112+ os.symlink('1', self.tempdir + '/rel-to-1')
113+ os.symlink('/1', self.tempdir + '/abs-to-1')
114+
115+ repo._fix_contents(debdir=self.tempdir)
116+
117+ self.assertEqual(os.readlink(self.tempdir + '/rel-to-a'), 'a')
118+ self.assertEqual(os.readlink(self.tempdir + '/abs-to-a'), 'a')
119+ self.assertEqual(os.readlink(self.tempdir + '/abs-to-b'), '/b')
120+ self.assertEqual(os.readlink(self.tempdir + '/rel-to-1'), '1')
121+ self.assertEqual(os.readlink(self.tempdir + '/abs-to-1'), '1')
122+
123+ def test_fix_suid(self):
124+ files = {
125+ 'suid_file': (0o4765, 0o0765),
126+ 'guid_file': (0o2777, 0o0777),
127+ 'suid_guid_file': (0o6744, 0o0744),
128+ 'suid_guid_sticky_file': (0o7744, 0o1744),
129+ }
130+
131+ for key in files:
132+ with self.subTest(key=key):
133+ file = os.path.join(self.tempdir, key)
134+ open(file, mode='w').close()
135+ os.chmod(file, files[key][0])
136+
137+ repo._fix_contents(debdir=self.tempdir)
138+ self.assertEqual(
139+ stat.S_IMODE(os.stat(file).st_mode), files[key][1])

Subscribers

People subscribed via source and target branches