Konrad Lipinski [Tue, 2 Aug 2022 07:35:50 +0000 (09:35 +0200)]
Switch to CLOCK_MONOTONIC_COARSE
All uses of clock_gettime() are fine with coarse granularity. Renamed
monotonicNow() to monotonicCoarseNow() to reflect that.
Change-Id: Id60e79ca28a888ad98907184b7c11dd9d0b4aeee
Konrad Lipinski [Thu, 28 Jul 2022 07:53:10 +0000 (09:53 +0200)]
Refrain from calling sessiond in offline mode
Change-Id: I0e182d45f75cc99cbc11d692c29e6c7c0bcc0719
Konrad Lipinski [Wed, 13 Jul 2022 14:46:48 +0000 (16:46 +0200)]
Prioritize requests based on cpu boosting level
There are three boosting levels at present, hence three distinct
priorities are introduced. Since the priority space is small, the
priority queue is implemented via an array of FIFO queues.
CPU priority inheritance from client to server is also included.
The boosting level and priority inheritance facilities are provided by
the capi-system-resource module. According to said facilities'
designers, querying the boosting level is most efficient when done
directly in the queried thread. Thus, when making a security manager
client request, the boosting level is obtained and prepended to the
request payload. This is also makes requests atomic and mitigates the
potential for priority races.
Change-Id: Icc10fb5e40fa74eafe16726d28ac66cd8b560810
Konrad Lipinski [Wed, 20 Jul 2022 11:57:14 +0000 (13:57 +0200)]
Simplify service and IO thread's class hierarchies
* get rid of useless Generic* and Base* classes that do nothing
* shift what little functionality they provided to other entities
* make a few leaf classes final
* devirtualize a few methods across the hierarchy, either by making them
local or via CRTP
* replace the virtual Event hierarchy and handlers by a single
statically known Event type
Change-Id: Id3afef98ff99a5b0eb3966f1cfdf0dcaa52cd909
Konrad Lipinski [Wed, 13 Jul 2022 13:25:52 +0000 (15:25 +0200)]
Make socket manager counters more robust
Now that the service no longer needs to maintain a dictionary of all
socket connections, socket counters no longer need to be globally
unique. The only remaining use for those counters now involves checking
whether a particular socket descriptor has gone stale. Per-descriptor
counters are enough for that, incremented every time a particular
descriptor is reopened.
* use per-socket counters instead of a global one
* use unsigned for guaranteed wraparound
* increment counter when closing instead of when opening to make the
check for isOpen unnecessary when checking connections enqueued in
m_closeQueue or m_writeBufferQueue
Change-Id: I5b9102c6fe3f9eb183ce456d1334173ac37aab4b
Konrad Lipinski [Tue, 12 Jul 2022 09:01:37 +0000 (11:01 +0200)]
Refactor MessageBuffer and dependencies
Security manager's protocol assumes there's at most one message in
flight per connection at any given time. The MessageBuffer class can
hold one such message in various stages of completion, assembled via
either input or serialization and disposed of via either output or
deserialization.
This conceptual interface can be satisfied in a much simpler way than
what's currently present. All that is require for a MessageBuffer is a
single contiguous memory block and a little management on the side
(the block's size, the message size, offset into the block).
Since the protocol has the payload size stored as a size_t header prior
to a message's payload, there's no need to even store it separately - it
can be stored before the payload, just as in the protocol.
Implications:
* less memory copying/shuffling
* read the full message directly into a buffer in binary form
* deserialize directly from that buffer (no Pop(), no copies)
* reuse the buffer space for serialization of the return message
* output the return message into the socket without copying
* socket manager now assembles full messages before handing them to the
service, at no performance hit
* one MessageEvent per socket instead of Accept/Close/Read/Write events
* no need for the service to maintain connection state - it now operates
on a per-message basis
Change-Id: I45f6009ce09ae2f852cfee86a32426389bcf7a30
Konrad Lipinski [Tue, 19 Jul 2022 10:56:07 +0000 (12:56 +0200)]
Release 1.7.3
* Decrease service thread lock thrashing
* Fix subsession paths
Change-Id: I5fafb902584edfb88b6566ace91126cbe44761fa
Konrad Lipinski [Wed, 13 Jul 2022 14:13:55 +0000 (16:13 +0200)]
Decrease service thread lock thrashing
By not releasing the lock right after wait() returns.
Change-Id: Ic689aed448b9a00370252be2b09d7cb653bdcdc5
Konrad Lipinski [Mon, 18 Jul 2022 10:22:49 +0000 (12:22 +0200)]
Fix subsession paths
* place the "subsession" dir in TZ_USER_HOME instead of TZ_USER_APP
* skip over the empty subsession as returned by sessiond
* add sharedRO paths if applicable
* refrain from labelling paths inside skelDir for local installations
* refactor related code to reduce redundancy and improve robustness
Change-Id: I2ede9f53f490c9bf57d390796e2ca5a1774f8a09
Konrad Lipinski [Fri, 15 Jul 2022 08:41:01 +0000 (10:41 +0200)]
Release 1.7.2
* Basic integration with sessiond
* Drop socket manager multi service support
* Handle signals locally in socket manager main loop
* Switch socket manager notification from pipe to eventfd
* Remove unused sendmsg functionality
Change-Id: I9f21d9709dd6d0b7d8b2e446590d738d7f6d7504
Tomasz Swierczek [Wed, 30 Mar 2022 11:40:54 +0000 (13:40 +0200)]
Basic integration with sessiond
Allow ~/subsession/$light_username/apps_rw/$pkgName as legal package
directories as needed by the lightweight multiuser feature.
New paths are in force ONLY for local app installation
(for SM_APP_INSTALL_LOCAL install type in security-manager's API).
Lacks bind-mounting per-user relevant datadirs (separation of user
data). This is supposed to be added at later stage.
Change-Id: Ia042e608781c139651578475c94d4283ddf70a47
Konrad Lipinski [Tue, 12 Jul 2022 14:01:11 +0000 (16:01 +0200)]
Drop socket manager multi service support
That feature has never been used, it's always been dead weight.
Security manager is a single service so that's unlikely to ever change.
Implications:
* no need to store/check interface ID
* one service per socket manager - less bookkeeping, simpler destructor
* socket descriptors now only apply to accepted sockets
Change-Id: I84ce915f0ff6929df45a40a0a8f5cbf7a4214694
Konrad Lipinski [Tue, 12 Jul 2022 11:36:59 +0000 (13:36 +0200)]
Handle signals locally in socket manager main loop
* replace SignalService with a local descriptor
* handle the descriptor directly in the main loop
* drop the now unused m_working and MainLoopStop()
White at it, also drop the harmful TEMP_FAILURE_RETRY when calling
close() on service sockets.
Change-Id: I172456d1762aaed4c4f0dd46a49732aa28d9c5d6
Konrad Lipinski [Tue, 12 Jul 2022 09:49:53 +0000 (11:49 +0200)]
Switch socket manager notification from pipe to eventfd
* use eventfd for a more efficient wakeup mechanism
* handle it directly in the manager thread to reduce thrashing
* drop the now useless DummyService and SIGPIPE-related code
* check m_working in the main loop only if eventfd is ready for reading
Change-Id: I090d90a50f3c789445dd6d0daa637abf0d189348
Krzysztof Jackiewicz [Thu, 7 Jul 2022 12:00:27 +0000 (14:00 +0200)]
Remove unused sendmsg functionality
Kind of reverts
0798413641b7961a0132050aef6bd03270936625
Change-Id: I815e63a370528762f69b760340398e068b541b74
Tomasz Swierczek [Wed, 18 May 2022 07:00:01 +0000 (09:00 +0200)]
Release 1.7.1
* Enhance DB recovery logic
* Minor fix of wording in comment
* Remove unused code
Change-Id: Ide32e4e3257810994bcb8dfe6695c455e5c0007f
Tomasz Swierczek [Thu, 28 Apr 2022 09:13:42 +0000 (11:13 +0200)]
Enhance DB recovery logic
"If we are wise, let us prepare for the worst."
- George Washington
Previously, the logic of DB recovery was:
1. Remove the "-recovered" file flag, IF it survived reboot (shouldn't)
2. Check DB for corruption
3. IF corruption occured, then:
a. Replace original DB with fallback made at image creation
b. Create the "-recovered" file next to DB file that signals rest of the system some apps may be missing
If sudden poweroff happens between 3a and 3b, system will not get informed
about missing app installation data.
This patch changes order of operations 3a and 3b, and also removes
operation number 1. From now on, the system-level scripts responsible
for recovery should remove the flag, when full recovery was complete.
Changing order of 3a with 3b ensures the flag is created when
DB error was found and is not prone to sudden power-off.
The flag is meant to be used for file-existance signalling of the need
to reinstall apps that were not in the backed-up DB. Since its existence
can trigger app installation, which in turn, can launch & use security-manager
(which will also attemt to access the DB), it MUST be ensured that rules-loader
is not running concurrently with any other processes/services that may use security-manager's DB
(the recovery of DB from fallback/backup has to be complete). This is achieved
by systemd's "Before=" service option in rules-loader service file which prohibits
security-manager's socket & service start before rules loader-ends operation.
Change-Id: I472c09d9398f69a97e118b69aad61dc016e3d22d
Tomasz Swierczek [Wed, 4 May 2022 06:42:32 +0000 (08:42 +0200)]
Minor fix of wording in comment
Change-Id: I48e795f72a7ca2ad720ea475c611d57d1007a622
Tomasz Swierczek [Wed, 30 Mar 2022 11:10:38 +0000 (13:10 +0200)]
Remove unused code
Change-Id: I7ae95050e5018d3a38ee79401553b46e3dfc849b
Tomasz Swierczek [Mon, 6 Dec 2021 11:05:47 +0000 (12:05 +0100)]
Release 1.7.0
Bump versioning to 1.7.X as tizen_6.0 has branched-off.
This change should be synced to tizen_6.5 branch, too.
Change-Id: Ibed180c8cbc9df8d96b3e0bf0188b8c3d6d5bf9f
Tomasz Swierczek [Wed, 3 Nov 2021 06:45:41 +0000 (07:45 +0100)]
Release 1.6.21
* Retry blocking waitpid() on EINTR
Change-Id: I20c9a73a6e7573dddc8d4b3495e74031e620d036
Konrad Lipinski [Fri, 29 Oct 2021 12:19:54 +0000 (14:19 +0200)]
Retry blocking waitpid() on EINTR
Change-Id: I0b7bcc0ce1964a229b77a8456266696f4ae0a80b
Jin-gyu Kim [Wed, 25 Aug 2021 19:22:30 +0000 (04:22 +0900)]
Release 1.6.20
* Adding privilege group priv_platform.
Change-Id: If9dc65658e85143ef77cd0d117cc4fd22124215c
Jin-gyu Kim [Wed, 25 Aug 2021 02:25:22 +0000 (11:25 +0900)]
Adding privilege group priv_platform.
Adding group for http://tizen.org/privilege/internal/default/platform
Change-Id: Ib8c4d82e08b48d6cb233a626960806fe0f69c4ae
Jin-gyu Kim [Thu, 24 Jun 2021 04:05:55 +0000 (13:05 +0900)]
Release 1.6.19
* Adding privilege group priv_peripheralio
* Make prepare_app() safer in non-main threads
Change-Id: I8d25212ea1ae5042b0a894b172884b49ce38f3b7
Jin-gyu Kim [Wed, 23 Jun 2021 02:01:00 +0000 (11:01 +0900)]
Adding privilege group priv_peripheralio.
Adding priv_peripheralio group for http://tizen.org/privilege/peripheralio
Change-Id: I2a8ef3344d4d4840b918f72a1a836bfc0be7a4ce
Konrad Lipinski [Mon, 7 Jun 2021 16:44:55 +0000 (18:44 +0200)]
Make prepare_app() safer in non-main threads
Calling prepare_app() from a non-main thread in a multithreaded
process could fail. While labels for other threads were being correctly
set by writing to /proc/<tid>/attr/current, the prepare_app thread used
smack_set_label_for_self() and thus /proc/self/attr/current.
This is easily fixed by reusing label_for_self_internal() so that all
threads are uniformly treated, each using its own tid.
Change-Id: Id5b3071b08057200331d64bf8d6cd172ae729df1
Yunjin Lee [Mon, 19 Apr 2021 05:06:41 +0000 (14:06 +0900)]
Release 1.6.18
* Add core privileges: usb.host and log
Change-Id: Ic5ede43127e8c194943e18846b4ec10d4da220e9
Yunjin Lee [Fri, 9 Apr 2021 04:29:36 +0000 (13:29 +0900)]
Add core privileges: usb.host and log
- usb.host: app can access to connected external USB devices
- log: app can access to platform log data
- both are platform level
- http://tizen.org/privilege/log is mapped to gid log
- http://tizen.org/privilege/usb.host is mapped to gid usb_device
Change-Id: I1726b463c077921071ff9b9f0348effe80ade38c
Signed-off-by: Yunjin Lee <yunjin-.lee@samsung.com>
Yunjin Lee [Fri, 9 Apr 2021 01:42:50 +0000 (10:42 +0900)]
Release 1.6.17
* Fix issue from static analysis
Change-Id: I30597162967bc6bd2ee073030e4cd4cef82402b8
Tomasz Swierczek [Thu, 8 Apr 2021 12:39:19 +0000 (14:39 +0200)]
Fix issue from static analysis
The ChannelCreator::closeAll(), when called in copy constructor,
may operate on uninitialized data.
Change-Id: Iaec6b3edc7e685ce14f7ea8e4d94eb3f59c9f4b7
Yunjin Lee [Tue, 23 Mar 2021 03:07:07 +0000 (12:07 +0900)]
Release 1.6.16
* Add core privilege: bugreport.admin
* Fix coverage generation in rpm 4.14.1
Change-Id: I0886eb78e3f1fbdb94d48c20a62a9b4468af9560
Yunjin Lee [Tue, 23 Mar 2021 01:13:07 +0000 (10:13 +0900)]
Add core privilege: bugreport.admin
With http://tizen.org/privilege/bugreport.admin, app can request
creation of system or app's bugreport.
Change-Id: I4826ad7d7543d1945fae016f6f7146702287d6fc
Signed-off-by: Yunjin Lee <yunjin-.lee@samsung.com>
Tomasz Swierczek [Wed, 3 Mar 2021 13:55:09 +0000 (14:55 +0100)]
Fix coverage generation in rpm 4.14.1
Debug source package directories now have different names.
Change-Id: Icffd332802d5d37d4d9d61fa96d75fdaad78a538
Tomasz Swierczek [Tue, 9 Feb 2021 10:21:58 +0000 (11:21 +0100)]
Release 1.6.15
* Change systemd-devel package name
* Drop http://tizen.org/privilege/internal/livecoredump mapping to priv_livecoredump
Change-Id: Ibcaf231abb98267472226761ef404da021eab000
INSUN PYO [Wed, 3 Feb 2021 04:35:56 +0000 (13:35 +0900)]
Change systemd-devel package name
Change-Id: I25635d30ce598200c1e14cc0287ecd5da40c9eff
Karol Lewandowski [Mon, 25 Jan 2021 15:12:13 +0000 (16:12 +0100)]
Drop tizen.org/privilege/internal/livecoredump mapping to priv_livecoredump
The priv_livecoredump group was supposed to be used by system services
wanting to use livecoredump API. (For applications it's granted by app
manifest.)
Unfortunately, it's not allowed by tizen sanity checkers to specify priv_*
groups in dbus policy, which renders the mapping useless. System services
must use other means to grant access to the API (as described in livecoredump
repository).
Change-Id: I58984358d095515a57d217ca277e3b06cda40703
Tomasz Swierczek [Tue, 10 Nov 2020 07:32:31 +0000 (08:32 +0100)]
Release 1.6.14
* Add Requires=local-fs.target dependency to security-manager-rules-loader.service
* Automate code coverage measurement
Change-Id: Ib6a86a3361b2eebb7e2ba121e54c558514b24a91
INSUN PYO [Thu, 8 Oct 2020 08:41:28 +0000 (17:41 +0900)]
Add Requires=local-fs.target dependency to security-manager-rules-loader.service
In emergency mode, local-fs.target always fails.
So, you have to check if local-fs.target is successful.
Change-Id: I4a946f573dd714f77b510ae818497c7d24ea4e4d
Dariusz Michaluk [Tue, 1 Sep 2020 12:33:41 +0000 (14:33 +0200)]
Automate code coverage measurement
To gather unit tests coverage report:
- use COVERAGE build_type,
- instal security-manager-coverage rpm,
- run security-manager-coverage.sh script.
Change-Id: I34960e55e4cff81d0e99864e3c3ed4d5d3c48385
Tomasz Swierczek [Thu, 29 Oct 2020 08:56:29 +0000 (09:56 +0100)]
Release 1.6.13
* Add check for $TZ_SYS_RUN/lock existance in update scripts
Change-Id: I57e51af38527cdac9b350bcf0561094744f83290
Tomasz Swierczek [Thu, 29 Oct 2020 08:55:09 +0000 (09:55 +0100)]
Add check for $TZ_SYS_RUN/lock existance in update scripts
The location for locking directory can be not mounted/not created
yet at update running time. TV images should not run security-manager
at this moment, so the updaring script should continue normally
Change-Id: I8d84af74a33354efd5e5dcae672340793d3d961d
Tomasz Swierczek [Mon, 26 Oct 2020 11:06:18 +0000 (12:06 +0100)]
Release 1.6.12
* Relax exit-on-error in update scripts
* Change FileLocker implemenation from POSIX to libc flocks
Change-Id: If53124c609da6f196feab8a3e9e68c46a2ea7714
Tomasz Swierczek [Fri, 23 Oct 2020 06:54:16 +0000 (08:54 +0200)]
Relax exit-on-error in update scripts
These scripts use systemctl systemd command to start & stop service/socket
of security-manager. On systems where systemd is not used to manage
security-manager (ie. some TV images), this can result in update
script being not executed properly.
Added "set +e/set -e" before each systemctl invocation.
With this set of changes, it is assumed that whatever mechanism
is actually used to manage security-manager service, it is ensuring
that the daemon is NOT running when updates are being executed and that
it IS started after the update.
Updated scripts will try to lock the $TZ_SYS_RUN/lock/security-manager.lock
file, usually taken by daemon at its startup; if that fails,
updates will exit with an error.
Change-Id: If452415465a6c31ba7360f4b0272d51708602242
Tomasz Swierczek [Mon, 26 Oct 2020 10:07:14 +0000 (11:07 +0100)]
Change FileLocker implemenation from POSIX to libc flocks
Thanks to this change, same locking could be used in sh/bash
scripts and in security-manager daemon (which previously
used the POSIX-based boost locks).
Change-Id: Ia4f2a5251d3556a40a68234fc2dc1ea51ac48188
Konrad Lipinski [Thu, 22 Oct 2020 11:29:17 +0000 (13:29 +0200)]
Release 1.6.11
* Apply private sharing rules before relabeling
Change-Id: I19d5882969ba5f65049e014b89f7dafd5534fca4
Konrad Lipinski [Tue, 20 Oct 2020 13:35:20 +0000 (15:35 +0200)]
Apply private sharing rules before relabeling
Prior to this commit, applyPrivatePathSharing does this:
1. Relabel a privately shared file.
2. Enable the package to rwxat the file's label.
Thus, there's a window between steps 1 & 2 where the package is unable
to access the file. This can be remedied by changing the order to:
1. Enable the package to rwxat the file's label.
2. Relabel the privately shared file.
The change preserves current semantics post-return but eliminates the
window.
The context:
Reportedly, the utc_rpc_port_set_private_sharing_array_p TCT test has
revealed a possibility of a race condition where a package owner would
get a smack access error when trying to unlink one of its own privately
shared files. This has reportedly happened on TM1 and some unspecified
TV product.
HQ inserted a 10ms sleep into ServiceImpl::applyPrivatePathSharing right
before return and, reportedly, it seems to have fixed the issue. They
seem partial to the assumption that the root cause is related to a race
condition in the kernel (as in: smack rules are being applied with a
delay). Thus, an idea for a possible solution involved checking smack
access client-side to make sure all is well before private sharing is
considered applied.
Given the fact that smack has been in place for quite some time now, I
find the possibility of a race condition unlikely. Unfortunately, I
haven't been able to prove anything. I couldn't reproduce the problem
and failed to find any obvious faults in the TCT test.
If there is a race condition, checking smack access client-side may not
be enough (it would only guarantee the client process or thread to be
race-free, TCT tests or the platform may need stronger guarantees). I'm
not inclined to do that unless there's proof. Such messy defensive code
tends to do more harm then good, especially if the race condition is
elsewhere.
Change-Id: I0a57edd6535eb1889d9bb8e5aaa6ddab58ca7009
Tomasz Swierczek [Mon, 19 Oct 2020 09:07:58 +0000 (11:07 +0200)]
Release 1.6.10
* Change author labels recursively in the upgrade script.
* Increase timeout waiting for signal delivery to 2 seconds
Change-Id: I6221d76c44eef78cb33f3d75f1b5bec52fac13df
jin-gyu.kim [Mon, 19 Oct 2020 06:12:42 +0000 (15:12 +0900)]
Change author labels recursively in the upgrade script.
SMACK labels of all resources in trusted directory should be updated.
Change-Id: I992ac67fbcb635455fd5eda93e9d8f1a1d0da5a1
Tomasz Swierczek [Mon, 19 Oct 2020 06:57:18 +0000 (08:57 +0200)]
Increase timeout waiting for signal delivery to 2 seconds
The prepare_app is synchronizing threads security attributes in app
candidate process, which can be multithreaded. Security-Manager's
implementation mimics implementation in libc for smack label synchronization,
using signal handlers to do that.
In some systems under heavy load current timeout we're waiting for signal
delivery can be not enough, hence increasing the timeout.
Change-Id: I2b73c743fee61acbaeb834566a43b0f427218aab
jin-gyu.kim [Fri, 16 Oct 2020 00:58:03 +0000 (09:58 +0900)]
Release 1.6.9
* Fix a typo in privilege-smack.list
Change-Id: Ibd8eb6ad3cd7ecba214106ee56704e08b88999a1
jin-gyu.kim [Fri, 16 Oct 2020 00:51:06 +0000 (09:51 +0900)]
Fix a typo in privilege-smack.list
System::Privilege:AppDebugging -> System::Privilege::AppDebugging
Change-Id: I4307d3d93aff5b068e8f7923d72a6e5182f4becc
Mateusz Cegielka [Fri, 2 Oct 2020 13:14:52 +0000 (15:14 +0200)]
Release 1.6.8
* Fix segfault when iterating directories
* Remove unused code from sha1.c
* Revert "Add listing running apps based on namespace"
* Remove redundant author name from db
Change-Id: I3ba9a55a02ff08a48563ec3941fc8adf904a4fa9
Mateusz Cegielka [Mon, 28 Sep 2020 16:25:51 +0000 (18:25 +0200)]
Fix segfault when iterating directories
Code used for iterating directories recursively with Boost calls .pop()
if the iteration returns an error, so that it exits the current
directory and continues the iteration. However, this can cause
segmentation faults, and if it doesn't, it causes some other directories
to be indeterministically skipped instead.
What is the proper way to do this then...? Boost apparently does not
place too much focus on stability, because the behaviour is different in
every version I checked (1.65.0 from Ubuntu 18.04, 1.71.0 from Tizen and
1.72.0 from Arch). Also, since 1.72.0 it'll be impossible to both
continue the iteration and log that anything was wrong.
I changed the behaviour to stop iteration on errors and return an
internal error instead. The immediate reason is making sure a Boost
update won't break this code, but a system service receiving filesystem
errors in directories it created is a pathological case indicating other
problems with system configuration that should not be accepted.
Change-Id: I69b7fb75f2b58d0ca1418b6bbb3ccd2480296918
Krzysztof Jackiewicz [Mon, 28 Sep 2020 18:23:31 +0000 (20:23 +0200)]
Remove unused code from sha1.c
Change-Id: I28c8f71b8e6c7bc4a98dc7e43ebfaba099351c40
Dariusz Michaluk [Tue, 1 Sep 2020 11:50:30 +0000 (13:50 +0200)]
Revert "Add listing running apps based on namespace"
It seems that this tool is unused.
This reverts commit
1a680bb1d2592a4110ca5d026c06dd11222d4e7c.
Change-Id: Ic7bd3f469a771d97e6a07af21912cd33140be46c
Krzysztof Jackiewicz [Mon, 28 Sep 2020 12:01:51 +0000 (14:01 +0200)]
Remove redundant author name from db
Remove author's name from db as it's no longer needed. Make few minor changes
related to author.
Change-Id: I03f195298f6aa69d970f5d384b2ab441220f82e4
Tomasz Swierczek [Mon, 21 Sep 2020 05:48:51 +0000 (07:48 +0200)]
Release 1.6.7
* Optimize loading group information.
* Fix author_id mismatch after DB upgrade
Change-Id: I16cc8e235ea1f39a8974df2f90f12341cbb1d0b0
jin-gyu.kim [Thu, 10 Sep 2020 07:11:32 +0000 (07:11 +0000)]
Optimize loading group information.
Store group ids in a new configuartion file to avoid calculating it every time.
Those are written in $POLICY_PATH/group-id.list when policy rpm is installed.
These changes will speed up about 10 times for calulating group ids.
Change-Id: I0d71a44fdb7513a1c63c107062bfbe344b6889e8
Dariusz Michaluk [Mon, 20 Jul 2020 12:20:07 +0000 (14:20 +0200)]
Fix author_id mismatch after DB upgrade
author_id is a DB table primary key and depends on apps instalation
order. Instead of using author_id in SMACK label, use 64 bits (16 character string)
of SHA1(author_name) in hex format.
This commit includes:
- sqlite3-sha1 extension copied from:
https://github.com/sqlite/sqlite/blob/master/ext/misc/sha1.c
- new DB schema and migration script,
- rules loader adjustment to new SMACK label,
- filesystem (SECURITY_MANAGER_PATH_TRUSTED_RW) relabeling,
- app instalation changes.
Change-Id: I4f478e0b9dfde06ef752d250d5bc7ef3183cde19
Tomasz Swierczek [Tue, 15 Sep 2020 09:46:01 +0000 (11:46 +0200)]
Release 1.6.6
* Add configuration for appdebugging & internet Smack-controlled privileges
* Calculate application privilege level based on manifest data passed by installer
* Remove unused GetAuthorIdByName()
Change-Id: I53d3b6eab4d32fca6ff97e7f9681fded1fb6c323
Tomasz Swierczek [Fri, 7 Aug 2020 12:46:27 +0000 (14:46 +0200)]
Add configuration for appdebugging & internet Smack-controlled privileges
1st step in changing nether to Smack-based network access control
is to provide alternative configuration.
Change-Id: I811750af88a68b85cb7454d53b536a22884cdd6a
Tomasz Swierczek [Mon, 10 Aug 2020 12:22:35 +0000 (14:22 +0200)]
Calculate application privilege level based on manifest data passed by installer
privilege-checker soon will need the cert-level information to calculate
application privilege attributes (blacklisted or privacy).
This cert-level will be, in target solution, passed as installation argument to
install request (see commit
eb065339daf1ed9b091add719128f64e2372fd0e).
However, because that API was only recently introduced,
simply storing this data in security-manager.db at app install time and then
reusing it at userInit stage will not do the trick in a FOTA scenario (userInit
called after a FOTA where some apps are already in the DB).
Preparing a new DB field and running a migration script to calculate that field could
be a solution to the problem, but it would require additional sql query to get
application privilege-level inside implementation of userInit routine.
Alternative solution, exercised by this patch, is to rely on the installer,
which seems to be always adding the:
http://tizen.org/privilege/internal/default/[public | partner | platform]
privileges to install request, depending on the actual privilege level of package.
Since CynaraAdmin::userInit already has the global manifest bucket listed in memory,
there's no need for additional DB fetch - only one more iteration over the list to get
the highest privilege level available for given app.
Change-Id: Ib860e7f4d09e7f434197ddc08ae3777a119734d0
Dariusz Michaluk [Mon, 20 Jul 2020 13:59:19 +0000 (15:59 +0200)]
Remove unused GetAuthorIdByName()
Change-Id: Ie83236411ece80754f0edd1428aedfda13796098
Yunjin Lee [Thu, 20 Aug 2020 04:32:13 +0000 (13:32 +0900)]
Release 1.6.5 (modified)
* Add setting package type and privilege level in app install cmd
* Add core privilege: network.route
* Previous release commit missed 1 commit to include but merged hence
made modified release commit to fix that
Change-Id: Id4dc8cfa73290d8b70d6caa8321f70616a547939
Signed-off-by: Yunjin Lee <yunjin-.lee@samsung.com>
Yunjin Lee [Wed, 19 Aug 2020 07:43:22 +0000 (16:43 +0900)]
Release 1.6.5
* Add core privilege: network.route
Change-Id: Iab41934cc11f55fb6f5227d876c08b991182160d
Mateusz Cegielka [Thu, 6 Aug 2020 13:17:59 +0000 (15:17 +0200)]
Add setting package type and privilege level in app install cmd
Patch I518eb4524c9c1f3ff2e6d68ea25c037591f6634b has added two new
properties that can be set when installing an application. However, the
cmd tool used for installing applications was not updated.
This patch adds the missing options to the security-manager-cmd tool.
Change-Id: I02b00a75528e870be5f22e6d37cb49796b95fd82
Yunjin Lee [Wed, 19 Aug 2020 05:21:29 +0000 (14:21 +0900)]
Add core privilege: network.route
- network.route: With this privilege, app can add or remove route table
entries.
Change-Id: Ia97c7fb018f5522d60b41c1055677b2e6a544e5f
Signed-off-by: Yunjin Lee <yunjin-.lee@samsung.com>
Dariusz Michaluk [Wed, 29 Jul 2020 12:18:46 +0000 (14:18 +0200)]
Release 1.6.4
* Switch security-manager to dual license (Apache 2.0 or MIT)
* Remove unneeded dependencies from nss plugin
* Test recently added queries to privilege database
Change-Id: I9ee77eb102771a6ef388331e5d15fb5237d46fdc
Dariusz Michaluk [Fri, 24 Jul 2020 10:41:33 +0000 (12:41 +0200)]
Switch security-manager to dual license (Apache 2.0 or MIT)
Change-Id: Ic6566ca8fe012b4c4ebba2a411c04976c70b1abc
Dariusz Michaluk [Fri, 24 Jul 2020 09:59:51 +0000 (11:59 +0200)]
Remove unneeded dependencies from nss plugin
Dlog dependency was replaced by systemd journal on HQ request.
Change-Id: Ibb8ab3ba11ef9295721cfedfcbc0336dadf5d2bb
Mateusz Cegielka [Fri, 10 Jul 2020 14:19:53 +0000 (16:19 +0200)]
Test recently added queries to privilege database
The PrivilegeDb class contains wrappers for running SQLite requests.
Since unit tests for it were created, more kinds of supported
statements have been added, but the tests were not updated.
I have added new tests that cover the GetAppPkgInfo, GetUserAppsFromPkg
SetSharedROPackage and IsUserPkgInstalled queries. I have also modified
existing privilege license tests to also cover
GetLicenseForClientPrivilegeAndPkg and AddAppDefinedPrivileges queries.
Change-Id: I3b43942f579cfc692b44203a2ea99b8c41d7be80
Tomasz Swierczek [Fri, 10 Jul 2020 06:51:59 +0000 (08:51 +0200)]
Release 1.6.3
* Fix CheckProperDrop tests
* Reimplement prepare_app proper drop checking
* Add smack-rules positive tests
* Enhance testability of TemplateManager class
* Add logging classes to unit tests
* Add unit tests for template manager class
* Remove unused code from sql_connection.cpp
* Add negative test cases wherever possible
* Add unit tests for functions in utils.cpp and other files
* Add tests for service_impl_utils.cpp functions
* Remove almost unused code from filesystem.cpp/.h
* Remove unused code from filesystem.cpp/.h
* Add test cases for filesystem.cpp functions
* Set C++ 17 flags
* Categorize unit test cases as negative or positive
* Disable assert() for release builds
Change-Id: I2871e378cf3f1002098df774b05fc7ee9b7b17eb
Konrad Lipinski [Mon, 15 Jun 2020 15:31:10 +0000 (17:31 +0200)]
Fix CheckProperDrop tests
Moved into a separate commit at a reviewer's request.
Accommodate the new implementation:
* Run each test inside a fork() so that caps can be freely zeroed.
* Add namespace unsharing, uid, gid and groups tests.
Change-Id: Ic8c608b2cd301b2898cbcd3b1ae3dcc3f62cecda
Konrad Lipinski [Tue, 21 Apr 2020 17:32:17 +0000 (19:32 +0200)]
Reimplement prepare_app proper drop checking
Procps-ng does not reliably check for errors. They are for the most part
silently ignored. The only way to approximately check for success is by
checking errno. That's what we've been doing up till now. However, errno
is not mentioned in the contract at all. Syscalls that succeed may zero
errno and mask prior errors.
Pre-3.12 kernels require CAP_SYS_PTRACE for task namespace inspection.
In particular, contemporary TM1 images feature a 3.10 kernel. On such
devices, PROC_FILLNS may result in errno being set to EACCES (unless
overwritten as per the previous paragraph). Such is the case on TM1,
making CheckProperDrop::checkThreads() fail whenever there are two or
more threads.
Checking for identical caps is not enough to ensure proper drop. A rogue
thread may survive sync_threads_internal() (which is racy by nature),
use capset() to set main thread's caps to zero, then terminate before
CheckProperDrop::getThreads() starts due to a lucky interleaving. This
can be guarded against by mandating capabilities to be zeroed for all
threads.
* Replace procps-ng usage with local code.
* Assert zero caps instead of identical caps.
* Refrain from checking pid and user namespaces, kernel guarantees
consistency across threads (see man unshare(2)).
* Compute the set of checked namespace kinds as a bitmask at manager
startup, ipc the bitmask to clients in prepare_app return payload.
* Set bitmask to zero for pre-3.12 kernels that require CAP_SYS_PTRACE
for task namespace inspection.
* Disable compilation of test_check_proper_drop.cpp. The tests were
written under the assumption that caps do not have to be zeroed. This
is no longer the case. Zeroing caps requires fork support, there are
also new edge cases to test. This makes the needed change substantial.
By review request it will be included in a future commit.
Change-Id: I4814cfd92dc524c02d87926236d8beb97d633c82
Tomasz Swierczek [Fri, 22 May 2020 07:51:23 +0000 (09:51 +0200)]
Add smack-rules positive tests
The goal of this commit is to increase code coverage of unit-tests.
Change-Id: I800695c7c31d192a46371b1c9138da9159f7f773
Tomasz Swierczek [Tue, 2 Jun 2020 07:00:17 +0000 (09:00 +0200)]
Enhance testability of TemplateManager class
The getAllMappedPrivs() method used to have a static variable
holding mapped privileges - the configuration was meant to be loaded
only once to improve performance, effectively by limiting runtime
allocation of a std::vector<std::string>.
However, the class holds other data in instance variables, that can
be filled at init() call on each object creation. This can cause
inconsistency that make ie. the test T1138_all_mapped_privileges
to fail because of different configuration loaded vs. stored in static
variable.
This commit removes the static variable, calculating the instance-level
variable on init() instead - this allows various configurations to be
tested in single unit test framework binary and keeps the performance
optimization, while wasting some memory.
Change-Id: Ic18bf1ca34e4a8deba2e0d876a735c29a277f4f6
Tomasz Swierczek [Fri, 22 May 2020 06:02:04 +0000 (08:02 +0200)]
Add logging classes to unit tests
Change-Id: Ife01f17db01dc2657c005ab3d8b741826ce6ed17
Zofia Abramowska [Tue, 24 Mar 2020 17:21:29 +0000 (18:21 +0100)]
Add unit tests for template manager class
Change-Id: I2781dcd3b87ddbeea9578ff15d073c909cf4deb3
Tomasz Swierczek [Tue, 5 May 2020 08:57:36 +0000 (10:57 +0200)]
Remove unused code from sql_connection.cpp
Change-Id: Id467ec93c5c202da5f2333444a6c3145c1857083
Tomasz Swierczek [Thu, 9 Apr 2020 12:51:20 +0000 (14:51 +0200)]
Add negative test cases wherever possible
Yes, repeating same test code body many times
to test each unprintable character below ' '
is not elegant, but it gets us to > 50%
of negative test cases, with room for improvement.
Yes, this seems ugly, but does the job.
Yes, I will have to wash my hands after committing this.
So here I am, with this patch, before you,
Dear Reviewer, so you don't have to make it.
Titan! to whose immortal eyes
The sufferings of mortality,
Seen in their sad reality,
Were not as things that gods despise;
(...)
Lord Byron, Prometheus
Change-Id: I48d7466ef6ca4143bf759d9b70ce60bdd347935c
Tomasz Swierczek [Thu, 2 Apr 2020 11:47:45 +0000 (13:47 +0200)]
Add unit tests for functions in utils.cpp and other files
This commit is aimed at increasing UT code coverage as well
as to increase negative test case to positive ratio.
Change-Id: I7f1576d1c6f1234359a1f5a0df6610e26450dd08
Tomasz Swierczek [Fri, 27 Mar 2020 14:35:47 +0000 (15:35 +0100)]
Add tests for service_impl_utils.cpp functions
This patch is aimed at increasing unit test code coverage.
Change-Id: I1392355c4933659b0f0ede136ae600ca0356936c
Tomasz Swierczek [Thu, 18 Jun 2020 07:52:36 +0000 (09:52 +0200)]
Remove almost unused code from filesystem.cpp/.h
fileSize was used only in one place, in tests
Change-Id: Ib2580f488c65d379059cf977f9533e27e93bdd47
Tomasz Swierczek [Wed, 17 Jun 2020 09:34:41 +0000 (11:34 +0200)]
Remove unused code from filesystem.cpp/.h
Change-Id: I5a4b722e34ba1bb691a0edf576b3e83a3b9499e0
Tomasz Swierczek [Mon, 23 Mar 2020 18:59:14 +0000 (19:59 +0100)]
Add test cases for filesystem.cpp functions
Previously, unit tests covered only about 26% of the lines,
this patch aims to increase the file coverage to at least 80%.
Change-Id: I985a2b690fdf1bbb355edb94753bf8c54108b9cf
Tomasz Swierczek [Wed, 17 Jun 2020 14:01:32 +0000 (16:01 +0200)]
Set C++ 17 flags
Will be needed later for inline static variables in class declaration
Change-Id: I203bf0f593a2bca4a95b06d98a85f609533b8039
Tomasz Swierczek [Wed, 18 Mar 2020 13:51:59 +0000 (14:51 +0100)]
Categorize unit test cases as negative or positive
Macros adding NEGATIVE_ or POSITIVE_ prefix to test name added too.
Some tests split for proper distinction of negative & positive tests.
Change-Id: I98b1c3b657cd84f01c364254aff064bf40b8b456
Konrad Lipinski [Wed, 20 May 2020 09:42:08 +0000 (11:42 +0200)]
Disable assert() for release builds
Change-Id: I61861dc2b181ff6c70a66af9e30b21ff0c9805d7
Tomasz Swierczek [Thu, 14 May 2020 08:38:45 +0000 (10:38 +0200)]
Release 1.6.2
* Add new arguments for installation requests
* Properly handle missing/invalid smack privilege policy
* Catch TizenPlatformConfig exception in NSMountLogic
* Get distinct app names from pkg
* Add listing running apps based on namespace
* Don't assume that default privilege Smack rules template exists
* Let template manager throw for configuration errors
* Fix enterMountNamespace() error handling.
Change-Id: I37322a85aeebd0e23274231e8acabc0106af5e92
Tomasz Swierczek [Mon, 6 Apr 2020 09:03:47 +0000 (11:03 +0200)]
Add new arguments for installation requests
Added arguments are:
* pkg_type (none, wrt, core, metadata)
* pkg_privilege_level (none, public, platform, partner)
This change is adjusting usage of privilege-checker functions
to its API changes.
Before this patch, privilege-checker used pkgmgr to check these data
about newly installed app. Because security-manager calls
privilege-checker at app install time, this required the pkgmgr db to be
filled before calling security-manager in app installer.
However, installer is currently changing its order of operation
and we can't rely on its data being available at this time.
Since this data is known explicitly by installer, its easy to add this
information to the installation request (per pkg).
If not set ("none" values), privilege-checker consults pkgmgr
like it used to.
Adding this API will also ease the situation in security-tests, where
pkgmgr DB had to be filled manually before each *fake* app installation
done only for purpose of security-manager API tests.
Now, the installation request in security-tests can be filled with
other-than-none values for both variables, which will result
in pkgmgr DB not being checked at app install time.
Change-Id: I518eb4524c9c1f3ff2e6d68ea25c037591f6634b
Krzysztof Jackiewicz [Mon, 27 Apr 2020 08:41:32 +0000 (10:41 +0200)]
Properly handle missing/invalid smack privilege policy
Continue to read other config files if smack privilege policy is missing.
Do ignore invalid smack-privilege template rules.
Remove unnecessary code.
Change-Id: I105e541b321523fa98556614509837cbbc5c5b13
Krzysztof Jackiewicz [Mon, 4 May 2020 10:53:07 +0000 (12:53 +0200)]
Catch TizenPlatformConfig exception in NSMountLogic
It may happen if there are some leftovers in /run/user/. Until now an
unknown exception was logged.
Change-Id: I02bbe251bd4ee094965810f8eeb228be78d7081a
Krzysztof Jackiewicz [Thu, 16 Apr 2020 13:00:36 +0000 (15:00 +0200)]
Get distinct app names from pkg
The same app can be installed for several users. This commit adds DISTINCT to
EGetAppsInPkg query to avoid duplicates.
Change-Id: Ic277ab899cf46aae2e1c08790e8db0e7e29c80ac
Zofia Abramowska [Fri, 10 Apr 2020 10:47:47 +0000 (12:47 +0200)]
Add listing running apps based on namespace
Change-Id: I8240646edef06fc267cc4a2177764494ec081fdb
Zofia Abramowska [Fri, 24 Apr 2020 15:29:03 +0000 (17:29 +0200)]
Don't assume that default privilege Smack rules template exists
Change-Id: I03c0fadeaf95885d191937d8c3e04fde70de047b
Zofia Abramowska [Fri, 24 Apr 2020 15:08:33 +0000 (17:08 +0200)]
Let template manager throw for configuration errors
Change-Id: Iec25cd08ae5cff6ef721b77022d07f734898f773
Dariusz Michaluk [Wed, 29 Apr 2020 14:42:59 +0000 (16:42 +0200)]
Fix enterMountNamespace() error handling.
There is a TOCTOU race condition between checking/entering app namespaces.
In this small time window, app can be killed,
so updating app namespace doesn't make sense, we can skip this step.
Change-Id: I27f8e0d5fed42a11b96dd79fc83b36be60aeca5e
Dariusz Michaluk [Wed, 22 Apr 2020 11:51:02 +0000 (13:51 +0200)]
Release 1.6.1
* Properly handle ENOENT error on encrypted device
* Move initial namespace setup to security_manager_prepare_app_candidate()
Change-Id: Ic99978f8d3b3b46d3322aae478bf698eb8b4f35c
Dariusz Michaluk [Tue, 21 Apr 2020 12:22:46 +0000 (14:22 +0200)]
Properly handle ENOENT error on encrypted device
Change-Id: Ica5318462304b9f96096f0376885d676e5e087ba