オープンソース・ソフトウェアの開発とダウンロード

Subversion リポジトリの参照

Diff of /trunk/1.8.x/ccs-patch/README.ccs

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/1.6.x/ccs-patch/README.ccs revision 1014 by kumaneko, Tue Mar 4 01:58:08 2008 UTC trunk/1.8.x/ccs-patch/README.ccs revision 4724 by kumaneko, Tue Mar 15 05:23:03 2011 UTC
# Line 1  Line 1 
1  Notes for TOMOYO Linux project  Notes for TOMOYO Linux project
2    
3  This is a handy Mandatory Access Control patch for Linux kernels.  This is a handy Mandatory Access Control patch for Linux kernels.
4  This patch is released under the GPL.  This patch is released under the GPLv2.
5    
6  Project URL: http://tomoyo.sourceforge.jp/  Project URL: http://tomoyo.sourceforge.jp/
7    
# Line 16  and you enjoy the life with Linux. Line 16  and you enjoy the life with Linux.
16    
17  This project was very inspired by the comic "Card Captor SAKURA",  This project was very inspired by the comic "Card Captor SAKURA",
18  one of the CLAMP's masterworks.  one of the CLAMP's masterworks.
 The names SAKURA and TOMOYO and SYAORAN were borrowed from the comic  
 with the heartfelt thanks to CLAMP.  
   
   
19    
20  ChangeLog:  ChangeLog:
21    
# Line 197  Fix 2006/02/27 Line 193  Fix 2006/02/27
193      @ Fix handling of trailing '\*' in PathMatchesToPattern().      @ Fix handling of trailing '\*' in PathMatchesToPattern().
194    
195        PathMatchesToPattern("/tmp/", "/tmp/\*") returned true        PathMatchesToPattern("/tmp/", "/tmp/\*") returned true
196        because "\*" matches to "more than or equals to 0 character        because "\*" matches "zero or more repetitions of characters
197        until '/' or end". But since this is a comparison between        until '/' or end". But since this is a comparison between
198        directory and non-directory, this should not match.        directory and non-directory, this should not match.
199    
# Line 408  Fix 2006/07/14 Line 404  Fix 2006/07/14
404    
405      @ Change behavior of pathname pattern matching.      @ Change behavior of pathname pattern matching.
406    
407        Until now, it was impossible to use patterns like "\*.txt"        Until now, it was impossible to use patterns like "\*.txt" because
408        because "\*" matched to more than 0 characters until next '/'.        "\*" matched zero or more repetitions of characters until next '/'.
409        Now, "\*" matches to more than 0 characters.        Now, "\*" matches zero or more repetitions of characters.
410    
411        Until now, it was impossible to use patterns like "\$00"        Until now, it was impossible to use patterns like "\$00"
412        because "\$" matched to more than 1 digits until next        because "\$" matched one or more repetitions of digits until next
413        non digit character.        non digit character.
414        Now, "\$" matches to more than 1 digits.        Now, "\$" matches one or more repetitions of digits.
415    
416        Also, new patterns "\x" "\X" "\a" "\A" "\@" are added.        Also, new patterns "\x" "\X" "\a" "\A" "\@" are added.
417    
# Line 432  Fix 2006/07/25 Line 428  Fix 2006/07/25
428    
429      @ Change matching rule for CheckFileACL().      @ Change matching rule for CheckFileACL().
430    
431        Until now, only first entry that matched to the requested pathname        Until now, only first entry that matched the requested pathname
432        was used for permission checking. For example, two entries        was used for permission checking. For example, two entries
433    
434        "2 /tmp/file-\$.txt"        "2 /tmp/file-\$.txt"
# Line 448  Fix 2006/07/25 Line 444  Fix 2006/07/25
444        This may potentially cause trouble because the result of        This may potentially cause trouble because the result of
445        permission checks depends on the order of entries.        permission checks depends on the order of entries.
446    
447        Now, all entries that matched to the requested pathname        Now, all entries that matched the requested pathname
448        are used for permission checking so that the result of        are used for permission checking so that the result of
449        permission checks doesn't depend on the order of entries.        permission checks doesn't depend on the order of entries.
450    
# Line 475  Fix 2006/08/04 Line 471  Fix 2006/08/04
471        succeeds to invoke do_execve() with filename = "/bin/ls" and        succeeds to invoke do_execve() with filename = "/bin/ls" and
472        argv[0] = "/bin/cat".        argv[0] = "/bin/cat".
473    
474        I introduced a keyword that permits the mismatch of        I introduced a directive that permits the mismatch of
475        basename of filename and argv[0].        basename of filename and argv[0].
476    
477  Fix 2006/08/10  Fix 2006/08/10
# Line 489  Fix 2006/08/10 Line 485  Fix 2006/08/10
485        domain ACL. For example,        domain ACL. For example,
486    
487          "1 /bin/sh if task.euid!=0"          "1 /bin/sh if task.euid!=0"
488    
489        allows the domain to execute /bin/sh only when the process's euid        allows the domain to execute /bin/sh only when the process's euid
490        is not 0, and        is not 0, and
491    
492          "6 /home/\*/\* if task.uid=path1.uid"          "6 /home/\*/\* if task.uid=path1.uid"
493    
494        allows the domain to read-write user's home directory        allows the domain to read-write user's home directory
495        only when the file's owner matches to the process's uid.        only when the file's owner matches the process's uid.
496    
497  Fix 2006/08/22  Fix 2006/08/22
498    
# Line 762  Fix 2006/12/22 Line 758  Fix 2006/12/22
758        if /some/program is called from "some_domain" domain.        if /some/program is called from "some_domain" domain.
759    
760        "some_domain" can be just the last component of domainname.        "some_domain" can be just the last component of domainname.
761        For example, giving "/bin/mail" as "some_domain" matches to        For example, giving "/bin/mail" as "some_domain" matches
762        all domains whose domainname ends with "/bin/mail".        all domains whose domainname ends with "/bin/mail".
763    
764  Fix 2007/01/19  Fix 2007/01/19
# Line 875  Fix 2007/04/18 Line 871  Fix 2007/04/18
871        based on realpath while argv[0] check is done based on the symlink's        based on realpath while argv[0] check is done based on the symlink's
872        pathname and argv[0], this specification will allow attackers behave        pathname and argv[0], this specification will allow attackers behave
873        as /bin/cat in the domain of /bin/ls if "/bin/ls and /bin/cat are        as /bin/cat in the domain of /bin/ls if "/bin/ls and /bin/cat are
874        links to /sbin/busybox" and "the attacker is permitted to create        links to /sbin/busybox" and "the attacker is permitted to create
875        a symlink named ~/cat that points to /bin/ls" and "the attacker is        a symlink named ~/cat that points to /bin/ls" and "the attacker is
876        permitted to run /bin/ls".        permitted to run /bin/ls".
877        So, I changed to compare the basename of realpath and argv[0].        So, I changed to compare the basename of realpath and argv[0].
# Line 963  Fix 2007/08/06 Line 959  Fix 2007/08/06
959    
960        Until now, users had to add init=/.init parameter to load policy        Until now, users had to add init=/.init parameter to load policy
961        before /sbin/init starts.        before /sbin/init starts.
962        I inserted call_usermodehelper() to call external policy loader when        I inserted call_usermodehelper() to call external policy loader when
963        execve("/sbin/init") is requested and external policy loader exists.        execve("/sbin/init") is requested and external policy loader exists.
964    
965        This change will remove init=/.init parameter from most environment,        This change will remove init=/.init parameter from most environment,
# Line 1007  Fix 2007/08/17 Line 1003  Fix 2007/08/17
1003    
1004      @ Remove initializer directive.      @ Remove initializer directive.
1005    
1006        Use "initialize_domain" instrad of "initializer".        Use "initialize_domain" instead of "initializer".
1007    
1008  Fix 2007/08/21  Fix 2007/08/21
1009    
# Line 1146  Fix 2008/01/15 Line 1142  Fix 2008/01/15
1142    
1143  Fix 2008/02/05  Fix 2008/02/05
1144    
1145      @ Use find_task_by_vpid() instead of find_task_pid().      @ Use find_task_by_vpid() instead of find_task_by_pid().
1146    
1147        Kernel 2.6.24 introduced PID namespace.        Kernel 2.6.24 introduced PID namespace.
1148        To search PID given from userland, the kernel needs to use        To search PID given from userland, the kernel needs to use
1149        find_task_by_vpid() instead of find_task_pid().        find_task_by_vpid() instead of find_task_by_pid().
1150    
1151  Fix 2008/02/14  Fix 2008/02/14
1152    
# Line 1247  Fix 2008/02/29 Line 1243  Fix 2008/02/29
1243        By default, this handler does nothing (i.e. merely reject execve()        By default, this handler does nothing (i.e. merely reject execve()
1244        request). You can specify any program to start what you want to do.        request). You can specify any program to start what you want to do.
1245    
1246        You can redirect attackers to somewhere else (e.g. honeypot).        You can redirect attackers to somewhere else (e.g. honey pot).
1247        This makes it possible to act your Linux box as an on-demand honeypot        This makes it possible to act your Linux box as an on-demand honey pot
1248        while keeping regular services for your usage.        while keeping regular services for your usage.
1249    
1250        You can collect information of the attacker (e.g. IP address) and        You can collect information of the attacker (e.g. IP address) and
# Line 1259  Fix 2008/02/29 Line 1255  Fix 2008/02/29
1255    
1256  Fix 2008/03/03  Fix 2008/03/03
1257    
1258      @ Add "force_alt_exec" keyword.      @ Add "force_alt_exec" directive.
1259    
1260        To be able to fully utilize "alt_exec" feature,        To be able to fully utilize "alt_exec" feature,
1261        I added "force_alt_exec" keyword so that        I added "force_alt_exec" directive so that
1262        all execute requests are replaced by the execute request of a program        all execute requests are replaced by the execute request of a program
1263        specified by alt_exec feature.        specified by alt_exec feature.
1264    
1265        If this keyword is specified for a domain, the domain no longer        If this directive is specified for a domain, the domain no longer
1266        executes any programs regardless of the mode of file access control        executes any programs regardless of the mode of file access control
1267        (i.e. the domain won't execute even if MAC_FOR_FILE=0 ).        (i.e. the domain won't execute even if MAC_FOR_FILE=0 ).
1268        Instead, the domain executes the program specified by alt_exec feature        Instead, the domain executes the program specified by alt_exec feature
# Line 1298  Fix 2008/03/04 Line 1294  Fix 2008/03/04
1294    
1295            0 -> disabled            0 -> disabled
1296            1 -> enabled            1 -> enabled
1297    
1298    Fix 2008/03/10
1299    
1300        @ Rename "force_alt_exec" directive to "execute_handler".
1301    
1302          To be able to use different programs for validating execve() parameters,
1303          I moved the location to specify the program's pathname from profile
1304          to domain policy.
1305    
1306          The "execute_handler" directive takes one pathname which is
1307          invoked whenever execve() request is issued. Thus, any "allow_execute"
1308          directives in a domain with "execute_handler" are ignored.
1309          This directive is designed for validating expected/desirable execve()
1310          requests in userspace, although there is no way to tell the caller
1311          that the execve() request was rejected.
1312    
1313        @ Rename "alt_exec" directive to "denied_execute_handler".
1314    
1315          The "denied_execute_handler" directive takes one pathname which is
1316          invoked only when execve() request was rejected. In other words,
1317          this program is invoked only when the following conditions are met.
1318    
1319            (1) None of "allow_execute" directives in the domain matched.
1320            (2) The execve() request was rejected in enforcing mode.
1321            (3) "execute_handler" directive is not used by the domain.
1322    
1323          This directive is designed for handling unexpected/undesirable execve()
1324          requests, to redirect the process issuing such requests to somewhere.
1325    
1326    Fix 2008/03/18
1327    
1328        @ Fix wrong/redundant locks in pre-vfs functions.
1329    
1330          lock_kernel()/unlock_kernel() in pre_vfs_rename() were redundant for
1331          2.6 kernels.
1332    
1333          Locking order in pre_vfs_link() and pre_vfs_unlink() for 2.4 kernels
1334          after 2.4.33 were different from before 2.4.32 .
1335    
1336    Fix 2008/03/28
1337    
1338        @ Disable execute handler loop.
1339    
1340          To be able to use "execute_handler" in a "keep_domain" domain,
1341          ignore "execute_handler" and "denied_execute_handler" directives
1342          if the current process is executing programs specified by
1343          "execute_handler" or "denied_execute_handler" directive.
1344    
1345          This exception is needed to avoid infinite execute handler loop.
1346          If a domain has both "keep_domain" and "execute_handler",
1347          any execute request by that domain is handled by an execute handler,
1348          and the execute handler attempts to process original execute request.
1349          But the original execute request is handled by the same execute handler
1350          unless the execute handler ignores "execute_handler".
1351    
1352        @ Update coding style.
1353    
1354          I rewrote the code to pass scripts/checkpatch.pl as much as possible.
1355          Function names were changed to use only lower letters.
1356    
1357    Version 1.6.0 2008/04/01   Feature enhancement release.
1358    
1359    Fix 2008/04/14
1360    
1361        @ Fix "Compilation failures" and "Initialization ordering bugs"
1362          with kernels before 2.4.30/2.6.11 .
1363    
1364          2.6 kernels before 2.6.9 didn't have include/linux/hardirq.h ,
1365          resulting compilation error at #include <linux/hardirq.h> .
1366          I added #elif condition.
1367    
1368          CentOS 4.6's 2.6.9 kernel calls do_execve() before initialization of
1369          ccs_alloc(), resulting NULL pointer dereference.
1370          I changed __initcall to core_initcall.
1371    
1372          CentOS 4.6's 2.6.9 kernel backported kzalloc() from 2.6.14 ,
1373          resulting compilation error at kzalloc().
1374          I modified prototype of kzalloc().
1375    
1376    Fix 2008/04/20
1377    
1378        @ Fix "Compilation failures" with kernels before 2.4.30/2.6.11 .
1379    
1380          Turbolinux 10 Server's 2.6.8 kernel backported kzalloc() as an inlined
1381          function, resulting compilation error at kzalloc().
1382          I converted kzalloc() from an inlined function into a macro.
1383    
1384    Fix 2008/04/21
1385    
1386        @ Add workaround for gcc 3.2.2's inline bug.
1387    
1388          RedHat Linux 9's gcc 3.2.2 generated a bad code
1389             if ((var_of_u8 & 0x000000BF) & 0x80000000) { }
1390          where the expected code is
1391             if ((var_of_u8 & 0xBF) & 0x80) { }
1392          when embedding ccs_acl_type2() into print_entry(),
1393          resulting runtime BUG().
1394          I added the expected code explicitly as a workaround.
1395    
1396    Fix 2008/05/06
1397    
1398        @ Add memory quota.
1399    
1400          1.5.x returns -ENOMEM when FindNextDomain() failed to create a new
1401          domain, but I forgot to return -ENOMEM when find_next_domain() failed to
1402          create a new domain.
1403    
1404          A domain is automatically created by find_next_domain() only if
1405          the domain for the requested program doesn't exist.
1406          This behavior is for the administrator's convenience.
1407          The administrator needn't to know how many domains are needed for running
1408          the whole programs in the system beforehand when developing the policy.
1409          But the administrator does not want the kernel to reject execution of the
1410          requested program when developing the policy.
1411    
1412          So, I think it is better to grant execution of programs even if
1413          find_next_domain() failed to create a new domain than reject execution.
1414          Thus, I decided not to return -ENOMEM when find_next_domain() failed to
1415          create a new domain. This exception breaks the domain transition rules,
1416          so I print "transition_failed" warning in /proc/ccs/domain_policy
1417          when this exception happened.
1418    
1419          Also, to prevent the system from being halted by unexpectedly allocating
1420          all kernel memory for the policy, I added memory quota.
1421          This quota is configurable via /proc/ccs/meminfo like
1422    
1423            echo Shared:  1048576 > /proc/ccs/meminfo
1424            echo Private: 1048576 > /proc/ccs/meminfo
1425    
1426    Version 1.6.1 2008/05/10   Bug fix release.
1427    
1428    Fix 2008/06/04
1429    
1430        @ Check open mode of /proc/ccs/ interface.
1431    
1432          It turned out that I can avoid allocating memory for reading if
1433          FMODE_READ is not set and memory for writing if FMODE_WRITE is not set.
1434    
1435        @ Wait for completion of /sbin/ccs-init .
1436    
1437          Since 2.4 kernel's call_usermodehelper() can't wait for termination of
1438          the executed program, I was using the close() request of
1439          /proc/ccs/meminfo to indicate that loading policy has finished.
1440          But since /proc/ccs/meminfo could be accessed for setting memory quota
1441          by /etc/ccs/ccs-post-init , I stopped using the close() request.
1442          The policy loader no longer need to access /proc/ccs/meminfo to notify
1443          the kernel that loading policy has finished.
1444    
1445    Fix 2008/06/05
1446    
1447        @ Fix realpath for pipes and sockets.
1448    
1449          Kernel 2.6.22 and later use different method for calculating d_path().
1450          Since fs/realpath.c didn't notice the change, the realpath of pipes
1451          appeared as "pipe:" rather than "pipe:[\$]" when they are opened via
1452          /proc/PID/fd/ directory.
1453    
1454        @ Add process's information into /proc/ccs/query .
1455    
1456          While /proc/ccs/grant_log and /proc/ccs/reject_log contain process's
1457          information, /proc/ccs/query doesn't contain it.
1458          To be able to utilize ccs-queryd and ccs-notifyd more, I added it into
1459          /proc/ccs/query .
1460    
1461    Fix 2008/06/10
1462    
1463        @ Allow using patterns for globally readable files.
1464    
1465          To allow users specify locale specific files to globally readable files,
1466          I relaxed checking in update_globally_readable_entry().
1467    
1468    Fix 2008/06/11
1469    
1470        @ Remove ALLOW_ENFORCE_GRACE parameter.
1471    
1472          Since unexpected requests caused by doing software updates can happen
1473          in all profiles, users likely have to write ALLOW_ENFORCE_GRACE=enabled
1474          to all profiles. And it makes meaningless to allow users to selectively
1475          enable specific profile's ALLOW_ENFORCE_GRACE parameter.
1476          So, I removed ALLOW_ENFORCE_GRACE parameter.
1477          Now, the system behaves as if ALLOW_ENFORCE_GRACE=enabled is specified.
1478          The behavior of "delayed enforcing" mode is defined in the following
1479          order.
1480    
1481          (1) The requests are rejected immediately if nobody is opening
1482              /proc/ccs/query interface.
1483          (2) The requests will be rejected in 10 seconds if somebody other than
1484              ccs-queryd (such as less(1)) is opening /proc/ccs/query interface,
1485              for such process doesn't write dummy decisions.
1486    
1487    Fix 2008/06/22
1488    
1489        @ Pass escaped pathname to audit_execute_handler_log().
1490    
1491          I was passing unescaped pathname to audit_execute_handler_log()
1492          which causes /proc/ccs/grant_log contain whitespace characters
1493          if execute handler's pathname contains whitespace characters.
1494    
1495    Fix 2008/06/25
1496    
1497        @ Return 0 when ccs_may_umount() succeeds.
1498    
1499          I forgot to clear error value in ccs_may_umount() when the requested
1500          directory didn't match "deny_unmount" directive. As a result, any umount()
1501          request with RESTRICT_UNMOUNT=enforcing returned -EPERM error.
1502    
1503    Version 1.6.2 2008/06/25   Usability enhancement release.
1504    
1505    Fix 2008/07/01
1506    
1507        @ Fix "Compilation failure" with 2.4.20 kernel.
1508    
1509          RedHat Linux 9's 2.4.20 kernel backported O(1) scheduler patch,
1510          resulting compilation error at ccs_load_policy().
1511          I added defined(TASK_DEAD) check.
1512    
1513    Fix 2008/07/08
1514    
1515        @ Don't check permissions if vfsmount is NULL.
1516    
1517          Some filesystems (e.g. unionfs) pass NULL vfsmount.
1518          I changed fs/tomoyo_file.c not to try to calculate pathnames
1519          if vfsmount is NULL.
1520    
1521    Version 1.6.3 2008/07/15   Bug fix release.
1522    
1523    Fix 2008/08/21
1524    
1525        @ Add workaround for gcc 4.3's bug.
1526    
1527          In some environments, fs/tomoyo_network.c could not be compiled
1528          because of gcc 4.3's bug.
1529          I modified save_ipv6_address() to use "integer literal" value
1530          instead for "static const u8" variable.
1531    
1532        @ Change prototypes of some functions.
1533    
1534          To support 2.6.27 kernels, I replaced "struct nameidata" with
1535          "struct path" for some functions.
1536    
1537        @ Detect distributor specific patches automatically.
1538    
1539          Since kernels with AppArmor patch applied is increasing,
1540          I introduced a mechanism which determines whether specific patches
1541          are applied or not, based on "#define" directives in the patches.
1542    
1543    Fix 2008/08/29
1544    
1545        @ Remove "-ccs" suffix from Makefile's EXTRAVERSION.
1546    
1547          To reduce conflicts on Makefile's EXTRAVERSION,
1548          I removed "-ccs" suffix from ccs-patch-2.\*.diff .
1549          Those who build kernels without using specs/build-\*.sh ,
1550          please edit EXTRAVERSION tag manually so that original kernels
1551          will not be overwritten by TOMOYO Linux kernels.
1552    
1553    Version 1.6.4 2008/09/03   Minor update release.
1554    
1555    Fix 2008/09/09
1556    
1557        @ Add "try again" response to "delayed enforcing" mode.
1558    
1559          To be able to handle pathname changes caused by software updates,
1560          "delayed enforcing" mode was introduced. It allows administrator to
1561          grant access requests which are about to be rejected by the kernel.
1562    
1563          To be able to handle pathname changes caused by software updates better,
1564          I introduced "try again" response. As "delayed enforcing" mode sleeps
1565          a process which violated policy, administrator can update policy while
1566          the process is sleeping. This "try again" response allows administrator
1567          to restart policy checks from the beginning after updating policy.
1568    
1569    Fix 2008/09/11
1570    
1571        @ Remember whether the process is allowed to write to /proc/ccs/ interface.
1572    
1573          Since programs for manipulating policy (e.g. ccs-queryd ) are installed
1574          in the form of RPM/DEB packages, these programs lose the original
1575          pathnames when they are updated by the package manager. The package
1576          manager renames these programs before deleting these programs so that
1577          the package manager can rollback the operation.
1578          This causes a problem when the programs are listed into /proc/ccs/manager
1579          using pathnames, as the programs will no longer be allowed to write to
1580          /proc/ccs/ interface while the process of old version of the program is
1581          alive.
1582    
1583          To solve this problem, I modified to remember the fact that the process
1584          is once allowed to write to /proc/ccs/ interface until the process
1585          attempts to execute a different program.
1586          This change makes it impossible to revoke permission to write to
1587          /proc/ccs/ interface without killing the process, but it will be better
1588          than nonfunctioning ccs-queryd program.
1589    
1590    Fix 2008/09/19
1591    
1592        @ Allow selecting a domain by PID.
1593    
1594          Sometimes we want to know what ACLs are given to specific PID, but
1595          finding a domainname for that PID from /proc/ccs/.process_status and
1596          reading ACLs from /proc/ccs/domain_policy by the domainname is very slow.
1597          Thus, I modified /proc/ccs/domain_policy to allow selecting a domain by
1598          PID. For example, to read domain ACL of current process from bash,
1599          run as follows.
1600    
1601          # exec 100<>/proc/ccs/domain_policy
1602          # echo select pid=$$ >&100
1603          # while read -u 100; do echo $REPLY; done
1604    
1605          If a domain is once selected by PID, reading /proc/ccs/domain_policy will
1606          print only that domain if that PID exists or print nothing otherwise.
1607    
1608        @ Disallow concurrent /proc/ccs/ access using the same file descriptor.
1609    
1610          Until now, one process can read() from /proc/ccs/ while other process
1611          that shares the file descriptor can write() to /proc/ccs/ .
1612          But to implement "Allow selecting a domain by PID" feature, I disabled
1613          concurrent read()/write() because the feature need to modify read buffer
1614          while writing.
1615    
1616    Fix 2008/10/01
1617    
1618        @ Add retry counter into /proc/ccs/query .
1619    
1620          To be able to handle some of queries from /proc/ccs/query without user's
1621          interaction, I added retry counter for avoiding infinite loop caused by
1622          "try again" response.
1623    
1624    Fix 2008/10/07
1625    
1626        @ Don't transit to new domain until do_execve() succeeds.
1627    
1628          Until now, a process's domain was updated to new domain which the process
1629          will belong to before do_execve() succeeds so that the kernel can do
1630          permission checks for interpreters and environment variables based on
1631          new domain. But this caused a subtle problem when other process sends
1632          signals to the process, for the process returns to old domain if
1633          do_execve() failed.
1634    
1635          So, I modified to pass new domain to functions so that I can avoid
1636          modifying a process's domain before do_execve() succeeds.
1637    
1638        @ Use old task state for audit logs.
1639    
1640          Until now, audit logs were generated using the task state after
1641          processing "; set task.state" part. But to generate accurate logs,
1642          I modified to save the task state before processing "; set task.state"
1643          part and use the saved state for audit logs.
1644    
1645        @ Use a structure for passing parameters.
1646    
1647          As the number of parameters is increasing, I modified to use a structure
1648          for passing parameters.
1649    
1650    Fix 2008/10/11
1651    
1652        @ Remove domain_acl_lock mutex.
1653    
1654          I noticed that I don't need to keep all functions that modify an ACL of
1655          a domain mutually exclusive. Since each functions handles different type
1656          of ACL, locking is needed only when they append an ACL to a domain.
1657          So, I modified to use local locks.
1658    
1659    Fix 2008/10/14
1660    
1661        @ Fix ccs_check_condition() bug.
1662    
1663          Due to a bug in ccs_check_condition(), it was impossible to use
1664          task.state[0] task.state[1] task.state[2] inside condition part
1665          if the ACL does not treat a pathname. For example, an ACL like
1666    
1667            allow_network TCP connect @HTTP_SERVERS 80 if task.state[0]=100
1668    
1669          didn't work.
1670    
1671    Fix 2008/10/15
1672    
1673        @ Show process information in /proc/ccs/.process_status .
1674    
1675          To be able to determine a process's type, I added a command "info PID"
1676          which returns process information of the specified PID in
1677          "PID manager=\* execute_handler=\* state[0]=\$ state[1]=\$ state[2]=\$"
1678          format.
1679    
1680    Fix 2008/10/20
1681    
1682        @ Use rcu_dereference() when walking the list.
1683    
1684          I was using "dependency ordering" for appending an element to a list
1685          without asking the reader to take a lock. But "dependency ordering"
1686          is not respected by DEC Alpha or by some aggressive value-speculation
1687          compiler optimizations.
1688    
1689          On such environment, use of "dependency ordering" can lead to system
1690          crash because the reader might read uninitialized value of newly
1691          appended element.
1692    
1693          To prevent the reader from reading uninitialized value of newly appended
1694          element, I inserted rcu_dereference() when walking the list.
1695    
1696    Fix 2008/11/04
1697    
1698        @ Use sys_getpid() instead for current->pid.
1699    
1700          Kernel 2.6.24 introduced PID namespace.
1701    
1702          To compare PID given from userland, I can't use current->pid.
1703          So, I modified to use sys_getpid() instead for current->pid.
1704    
1705          I modified to use task_tgid_nr_ns() for 2.6.25 and later instead for
1706          current->tgid when checking /proc/self/ in get_absolute_path().
1707    
1708    Fix 2008/11/07
1709    
1710        @ Fix is_alphabet_char().
1711    
1712          is_alphabet_char() should match 'A' - 'Z' and 'a' - 'z',
1713          but was matching from 'A' - 'F' and 'a' - 'f'.
1714    
1715        @ Add /proc/ccs/.execute_handler .
1716    
1717          Process information became visible to userspace by
1718          "Show process information in /proc/ccs/.process_status" feature.
1719          However, programs specified by execute_handler directive may run as
1720          non root user, making it impossible to see process information.
1721    
1722          So, I added a new interface that allows execute handler processes
1723          to see process information. The content of /proc/ccs/.execute_handler is
1724          identical to /proc/ccs/.process_status .
1725    
1726    Version 1.6.5 2008/11/11   Third anniversary release.
1727    
1728    Fix 2008/12/01
1729    
1730        @ Introduce "task.type=execute_handler" condition.
1731    
1732          The execute_handler directive is very very powerful. You can use this
1733          directive to do anything you want to do (e.g. logging and validating and
1734          modifying command line parameters and environment variables, opening and
1735          closing and redirecting files, creating pipes to implement antivirus and
1736          spam filtering, deploying a DMZ between the ssh daemon and the login
1737          shells).
1738    
1739          To be able to use this directive in a domain with keep_domain directive
1740          while limiting access to resources needed for such purposes to only
1741          programs invoked as an execute handler process, I added a new condition.
1742    
1743          In learning mode, "if task.type=execute_handler" condition part will be
1744          automatically added for requests issued by an execute_handler process.
1745    
1746        @ Introduce file's type and permissions as conditions.
1747    
1748          To be able to limit file types a process can access, I added
1749          new conditions for checking file's type and permissions.
1750          For example,
1751    
1752            allow_read /etc/fstab if path1.type=file path1.perm=0644
1753    
1754          will allow opening /etc/fstab for reading only if /etc/fstab is a regular
1755          file and it's permission is 0644, and
1756    
1757            allow_write /dev/null if path1.type=char path1.dev_major=1 path1.dev_minor=3
1758    
1759          will allow opening /dev/null for writing only if /dev/null is a character
1760          device file with major=1 and minor=3 attributes.
1761    
1762        @ Add memory quota for temporary memory used for auditing.
1763    
1764          Although there are MAX_GRANT_LOG and MAX_REJECT_LOG parameters
1765          which limit the number of entries for audit logs so that we can avoid
1766          memory consumption by audit logs, it would be more convenient if we can
1767          also limit the size in bytes.
1768          Thus, I added a new quota line.
1769    
1770            echo Dynamic: 1048576 > /proc/ccs/meminfo
1771    
1772          This quota is not applied to temporary memory used for permission checks.
1773    
1774    Fix 2008/12/09
1775    
1776        @ Fix ccs_can_save_audit_log() checks.
1777    
1778          Due to incorrect statement "if (ccs_can_save_audit_log() < 0)"
1779          while ccs_can_save_audit_log() is boolean, MAX_GRANT_LOG and
1780          MAX_REJECT_LOG were not working.
1781    
1782          This bug will trigger OOM killer if /usr/sbin/ccs-auditd is not working.
1783    
1784    Fix 2008/12/24
1785    
1786        @ Add "ccs_" prefix.
1787    
1788          To be able to tell whether a symbol is TOMOYO Linux related or not,
1789          I added "ccs_" prefix as much as possible.
1790    
1791        @ Fix ccs_check_flags() error message.
1792    
1793          I meant to print SYAORAN-ERROR: message when error == -EPERM,
1794          but I was printing it when error == 0 since 1.6.0 .
1795    
1796    Fix 2009/01/05
1797    
1798        @ Use kmap_atomic()/kunmap_atomic() for reading "struct linux_binprm".
1799    
1800          As remove_arg_zero() uses kmap_atomic(KM_USER0), I modified to use
1801          kmap_atomic(KM_USER0) rather than kmap().
1802    
1803    Fix 2009/01/28
1804    
1805        @ Fix "allow_read" + "allow_write" != "allow_read/write" problem.
1806    
1807          Since 1.6.0 , due to a bug in ccs_update_single_path_acl(),
1808          appending "allow_read/write" entry didn't update internal "allow_read"
1809          and "allow_write" entries. As a result, attempt to open(O_RDWR) succeeds
1810          but open(O_RDONLY) and open(O_WRONLY) fail.
1811    
1812          Workaround is to write an entry twice when newly appending that entry.
1813          If written twice, internal "allow_read" and "allow_write" entries
1814          are updated.
1815    
1816    Fix 2009/02/26
1817    
1818        @ Fix profile read error.
1819    
1820          Incorrect profiles were shown in /proc/ccs/profile
1821          if either CONFIG_SAKURA or CONFIG_TOMOYO is disabled.
1822    
1823    Fix 2009/03/02
1824    
1825        @ Undelete CONFIG_TOMOYO_AUDIT option.
1826    
1827          While HDD-less systems can use profiles with MAX_GRANT_LOG=0 and
1828          MAX_REJECT_LOG=0 , I undeleted CONFIG_TOMOYO_AUDIT option for saving
1829          memory used for /proc/ccs/grant_log and /proc/ccs/reject_log interfaces.
1830    
1831    Fix 2009/03/13
1832    
1833        @ Show only profile entry names ever specified.
1834    
1835          Even if an administrator specifies only COMMENT= and MAC_FOR_FILE=
1836          entries for /proc/ccs/profile , all available profile entries are shown.
1837          This was designed to help administrators to know what entries are
1838          available, but sometimes makes administrators feel noisy because of
1839          entries showing default values.
1840    
1841          Thus, I modified to show only profile entry names ever specified.
1842    
1843    Fix 2009/03/18
1844    
1845        @ Add MAC_FOR_IOCTL functionality.
1846    
1847          To be able to restrict ioctl() requests, I added MAC_FOR_IOCTL
1848          functionality.
1849    
1850          This functionality requires modification of ccs-patch-\*.diff .
1851    
1852        @ Use better name for socket's pathname.
1853    
1854          Until now, socket's pathname was represented as "socket:[\$]" format
1855          where \$ is inode's number. But inode's number is useless for name based
1856          access control. Therefore, I modified to represent socket's pathname as
1857          "socket:[family=\$:type=\$:protocol=\$]" format.
1858    
1859          This will help administrator to control ioctl() against sockets more
1860          precisely.
1861    
1862        @ Fix misplaced ccs_capable() call.  (only 2.6.8-\* and 2.6.9-\*)
1863    
1864          Location to insert ccs_capable(TOMOYO_SYS_IOCTL) in sys_ioctl() was
1865          wrong since version 1.1 .
1866    
1867        @ Insert ccs_check_ioctl_permission() call.
1868    
1869          To make MAC_FOR_IOCTL functionality working, I inserted
1870          ccs_check_ioctl_permission() call into ccs-patch-\*.diff .
1871    
1872    Fix 2009/03/23
1873    
1874        @ Move sysctl()'s check from ccs-patch-\*.diff to fs/tomoyo_file.c .
1875    
1876          Since try_parse_table() in kernel/sysctl.c is almost identical between
1877          all versions, I moved that function to fs/tomoyo_file.c .
1878    
1879        @ Relocate definitions and functions.
1880    
1881          To reduce exposed symbols, I relocated some definitions and functions.
1882    
1883    Fix 2009/03/24
1884    
1885        @ Add CONFIG_TOMOYO_BUILTIN_INITIALIZERS option.
1886    
1887          Some systems don't have /sbin/modprobe and /sbin/hotplug .
1888          Thus, I made these pathnames configurable.
1889    
1890    Version 1.6.7 2009/04/01   Feature enhancement release.
1891    
1892    Fix 2009/04/06
1893    
1894        @ Drop "undelete domain" command.
1895    
1896          I added "undelete domain" command on 2007/01/19, but never used by policy
1897          management tools. The garbage collector I added on 2007/01/29 will
1898          automatically reuse memory and allow administrators switch domain policy
1899          periodically, provided that the administrator kills processes in old
1900          domains before recreating new domains with the same domainnames.
1901    
1902          Thus, I dropped "undelete domain" command.
1903    
1904        @ Escape invalid characters in ccs_check_mount_permission2().
1905    
1906          ccs_check_mount_permission2() was passing unencoded strings to printk()
1907          and ccs_update_mount_acl() and ccs_check_supervisor(). This may cause
1908          /proc/ccs/system_policy and /proc/ccs/query to contain invalid
1909          characters within a string.
1910    
1911    Fix 2009/04/07
1912    
1913        @ Fix IPv4's "address_group" handling error.
1914    
1915          Since 1.6.5 , due to lack of ntohl() (byte order conversion) in
1916          ccs_update_address_group_entry(), "address_group" with IPv4 address was
1917          not working.
1918    
1919          This problem happens on little endian platforms (e.g. x86).
1920    
1921    Fix 2009/05/08
1922    
1923        @ Add condition for symlink's target pathname.
1924    
1925          Until now, "allow_symlink" keyword allows creation of a symlink but does
1926          not check the symlink's target. Usually it is no problem because
1927          permission checks are done using dereferenced pathname. But in some
1928          cases, we should restrict the symlink's target. For example,
1929          "ln -s .htpasswd /var/www/html/readme.html" by CGI program should be
1930          blocked because we will allow Apache to read both
1931          /var/www/html/readme.html and /var/www/html/.htpasswd .
1932    
1933          Thus, I added new condition, "symlink.target".
1934    
1935            allow_symlink /var/www/html/\*.html if symlink.target="\*.html"
1936    
1937            allow_symlink /var/www/html/\*\-.\* if symlink.target="\*\-.\*"
1938    
1939        @ Don't return -EAGAIN at ccs_socket_recvmsg_permission().
1940    
1941          It turned out that it is not permitted for accept() and recvmsg() to
1942          return -EAGAIN if poll() said connections/datagrams are ready. However,
1943          recvmsg() may return -EAGAIN and potentially confuse some applications
1944          because ccs_socket_recvmsg_permission() is returning -EAGAIN.
1945    
1946          Thus, I modified ccs_socket_recvmsg_permission() to return -ENOMEM
1947          rather than -EAGAIN.
1948    
1949    Fix 2009/05/19
1950    
1951        @ Don't call get_fs_type() with a mutex held.
1952    
1953          Until now, when ccs_update_mount_acl() is called with unsupported
1954          filesystem, /sbin/modprobe is executed from get_fs_type() to load
1955          filesystem module. And get_fs_type() does not return until /sbin/modprobe
1956          finishes.
1957    
1958          This means that it will cause deadlock if /sbin/modprobe (which is
1959          executed via get_fs_type() in ccs_update_mount_acl()) calls
1960          ccs_update_mount_acl(); although it won't happen unless an administrator
1961          inserts execute_handler to call mount() requests in learning mode or to
1962          add "allow_mount" entries to /proc/ccs/system_policy .
1963    
1964          I modified to unlock the mutex before calling get_fs_type().
1965    
1966    Fix 2009/05/20
1967    
1968        @ Update recvmsg() hooks.
1969    
1970          Since 1.5.0, I was doing network access control for incoming UDP and RAW
1971          packets inside skb_recv_datagram(). But to synchronize with LSM version,
1972          I moved ccs_recv_datagram_permission() hook from skb_recv_datagram() to
1973          udp_recvmsg()/udpv6_recvmsg()/raw_recvmsg()/rawv6_recvmsg() with name
1974          change to ccs_recvmsg_permission().
1975    
1976    Version 1.6.8 2009/05/28   Feature enhancement release.
1977    
1978    Fix 2009/07/03
1979    
1980        @ Fix buffer overrun when used with CONFIG_SLOB=y .
1981    
1982          Since 1.6.7 , ccs_allocate_execve_entry() was requesting for only 4000
1983          bytes while the comment says it is 4096 bytes. This may lead to buffer
1984          overrun when slob allocator is used, for slob allocator allocates exactly
1985          4000 bytes whereas slab and slub allocators allocate 4096 bytes.
1986    
1987    Fix 2009/09/01
1988    
1989        @ Add garbage collector support.
1990    
1991          Until now, it was impossible to release memory used by deleted policy.
1992          I added SRCU based garbage collector so that memory used by deleted
1993          policy will be automatically released.
1994    
1995        @ Remove word length limitation and line length limitation.
1996    
1997          Until now, the max length of a word is 4000 and the max length of a line
1998          is 8192. To be able to handle longer pathnames, I removed these
1999          limitations. Now, the max length (except the domainname and
2000          argv[]/envp[]) is 128K (which is the max amount of memory kmalloc()
2001          can allocate in most environments).
2002    
2003        @ Support more fine grained profile configuration.
2004    
2005          Profile was reconstructed.
2006    
2007        @ Support more fine grained parameters restrictions.
2008    
2009          "allow_create", "allow_mkdir", "allow_mkfifo", "allow_mksock" check
2010          create mode. "allow_mkblock" and "allow_mkchar" check create mode and
2011          major/minor device numbers. "allow_chmod" check new mode. "allow_chown"
2012          checks new owner. "allow_chgrp" checks new group.
2013    
2014        @ Allow number grouping.
2015    
2016          To help specifying numeric values, a new directive "number_group" is
2017          introduced.
2018    
2019        @ Remove "alias" directive and "allow_argv0" directive.
2020    
2021          Until now, "allow_execute" used dereferenced pathname if it is a symlink
2022          unless explicitly specified by "alias" directive.
2023    
2024          Now, "allow_execute" uses symlink's pathname if it is a symlink.
2025          "exec.realpath" in "if" clause checks the dereferenced pathname.
2026          "exec.argv[0]" in "if" clause checks the invocation name.
2027    
2028        @ Remove /proc/ccs/system_policy and /etc/ccs/system_policy.conf .
2029    
2030          "deny_autobind" was moved to /proc/ccs/exception_policy and
2031          /etc/ccs/exception_policy.conf . Other directives were moved to
2032          /proc/ccs/domain_policy and /etc/ccs/domain_policy.conf .
2033    
2034        @ Remove syaoran filesystem.
2035    
2036          Since "allow_create"/"allow_mkdir"/"allow_mkfifo"/"allow_mksock"/
2037          "allow_mkblock"/"allow_mkchar"/"allow_chmod"/"allow_chown"/"allow_chgrp"
2038          can restrict mode changes and owner/group changes, there is no need to
2039          restrict these changes at filesystem level.
2040    
2041          Thus, I removed syaoran filesystem.
2042    
2043        @ Reduce spinlocks.
2044    
2045          Until now, TOMOYO was using own list for detecting memory leak. But as
2046          kernel 2.6.31 introduced memory leak detection mechanism
2047          ( CONFIG_DEBUG_KMEMLEAK ), TOMOYO no longer needs to use own list.
2048    
2049          I removed the list to reduce use of spinlocks.
2050    
2051        @ Rewrite ccs-patch-2.\*.diff .
2052    
2053          ccs-patch-2.\*.diff was rewritten like LSM hooks.
2054    
2055        @ Don't check "allow_read/write" for open-for-ioctl-only.
2056    
2057          open(pathname, 3) means open for ioctl() only.
2058          Until now, TOMOYO was checking "allow_read/write" for open(pathname, 3).
2059          But since TOMOYO checks "allow_ioctl" for ioctl(), I modified not to
2060          require "allow_read/write" for open(pathname, 3).
2061    
2062        @ Add missing sigqueue() and tgsigqueue() hooks.
2063    
2064          Until now, kill(), tkill(), tgkill() had hooks but sigqueue() and
2065          tgsigqueue() didn't.
2066    
2067        @ Move files from fs/ to security/ccsecurity.
2068    
2069          Config menu section changed from "File systems" to "Security options".
2070    
2071          Kernel config symbols changed from CONFIG_SAKURA CONFIG_TOMOYO
2072          CONFIG_SYAORAN to CONFIG_CCSECURITY .
2073    
2074        @ Add global PID to audit logs.
2075    
2076          ccs-queryd was using domainname for reaching the domain which the process
2077          belongs to, but the domain could be deleted while ccs-queryd is handling
2078          policy violation. If the domain is deleted, ccs-queryd no longer can
2079          reach the domain by domainname. Thus, ccs-queryd now uses PID for
2080          reaching the domain which the process belongs to.
2081    
2082          Kernel 2.6.24 introduced PID namespace. The PID in access logs generated
2083          by a process inside a container is useless for ccs-queryd for reaching
2084          the domain which the process belongs to.
2085    
2086          Thus, I added global PID in audit logs.
2087    
2088        @ Transit to new domain before do_execve() succeeds.
2089    
2090          Permission checks for interpreters and environment variables are
2091          done using new domain. In order to allow ccs-queryd to reach the new
2092          domain via global PID, I reverted "Don't transit to new domain until
2093          do_execve() succeeds." made on 2008/10/07.
2094    
2095    Version 1.7.0 2009/09/03   Feature enhancement release.
2096    
2097    Fix 2009/09/04
2098    
2099        @ Fix wrong ccs_profile() calls.
2100    
2101          I can't call ccs_profile() for profile existence test because
2102          ccs_profile() never returns NULL.
2103    
2104    Fix 2009/09/06
2105    
2106        @ Fix wrong error code in ccs_try_alt_exec().
2107    
2108          ccs_try_alt_exec() was returning ENOMEM when kmalloc() failed.
2109          It needs to return -ENOMEM to fail.
2110    
2111    Fix 2009/09/10
2112    
2113        @ Do not check umount() permission for mount(MS_MOVE) requests.
2114    
2115          Until 1.6.x , umount() restriction was black listing. In 1.7.0 , it is
2116          white listing. This change caused "mount --move old new" requests to
2117          require "allow_unmount old" permission in addition to
2118          "allow_mount old new --move 0" permission.
2119          But we don't want to allow umount(old) requests when we want to allow
2120          only mount(old, new, MS_MOVE) requests. Thus, I modified not to check
2121          "allow_unmount old" permission for mount(old, new, MS_MOVE) requests.
2122    
2123    Fix 2009/09/11
2124    
2125        @ Support recursive match operators.
2126    
2127          Until now, ccs_path_matches_pattern() did not support recursive
2128          comparison. Thus, users had to repeat "/\*" when they want to specify
2129          recursively.
2130    
2131          I introduced "\{" and "\}" as repetition operator.
2132          To ensure consistency with TOMOYO's '/'-tokenized pattern matching rules
2133          and "\-" operator, only "/\{dir\}/" sequences (where dir does not contain
2134          '/') is permitted.
2135    
2136    Fix 2009/09/24
2137    
2138        @ Don't check chmod/chown capability for requests from kernel.
2139    
2140          Until now, ccs_setattr_permission() was inserted in notify_change().
2141          But notify_change() is also called by requests from kernel (e.g. UnionFS)
2142          and it made difficult to use TOMOYO on UnionFS.
2143    
2144          Thus, I moved ccs_capable() checks from ccs_setattr_permission() to
2145          ccs_chmod_permission() and ccs_chown_permission(), and removed
2146          ccs_setattr_permission().
2147    
2148    Fix 2009/09/25
2149    
2150        @ Embed more information into audit logs.
2151    
2152          Until now, /proc/ccs/grant_log /proc/ccs/reject_log /proc/ccs/query were
2153          not printing file's information (e.g. file's uid/gid/mode).
2154    
2155          Recently, users who started using "if" clause expect that the learning
2156          mode automatically adds various conditions like "if task.uid=path1.uid".
2157    
2158          But the profile will become too complicated if I support all possible
2159          conditions. Thus, I added all information which is enough to generate
2160          "if" clause with all possible conditions from audit logs.
2161    
2162          Now, the learning mode got different usage. Users can specify
2163          "CONFIG::learning={ max_entry=0 }" in the profile. All requests which
2164          are not permitted by policy will be sent to /proc/ccs/reject_log with
2165          "mode=learning" header lines. Users can selectively append conditions
2166          and append to the policy using "/usr/sbin/ccs-loadpolicy -d".
2167          The learning mode with "CONFIG::learning={ max_entry=0 }" is almost
2168          the same with the permissive mode, only difference is "mode=learning"
2169          and "mode=permissive".
2170    
2171    Fix 2009/10/05
2172    
2173        @ Fix size truncation bug at ccs_memcmp().
2174    
2175          ccs_memcmp() was using "u8" for size parameter by error. Therefore, when
2176          size >= 256 was passed to ccs_memcmp(), it was doing partial comparison
2177          (incorrect result) or read overrun (CPU stall).
2178    
2179          ccs_memcmp() should use "size_t" for size parameter because size of
2180          "struct ccs_condition" may exceed 256 bytes if complicated condition was
2181          given.
2182    
2183    Fix 2009/10/08
2184    
2185        @ Add CONFIG_CCSECURITY_DEFAULT_LOADER option.
2186    
2187          I made the default policy loader's pathname ( /sbin/ccs-init )
2188          configurable.
2189    
2190        @ Add CONFIG_CCSECURITY_ALTERNATIVE_TRIGGER option.
2191    
2192          Some environments do not have /sbin/init . In such environments, we need
2193          to use different program's pathname (e.g. /init or /linuxrc ) as
2194          activation trigger.
2195    
2196          Thus, I made the alternative trigger ( /sbin/ccs-start ) configurable.
2197    
2198    Fix 2009/11/02
2199    
2200        @ Fix buffer contention.
2201    
2202          A permission like
2203    
2204            allow_env PATH if exec.envp["PATH"]="/"
2205    
2206          was not working since I was using the same buffer for both environment
2207          variable's name and value.
2208    
2209    Fix 2009/11/03
2210    
2211        @ Fix memory leak in ccs_write_address_group_policy().
2212    
2213          I forgot to call kfree() if same entry was added.
2214    
2215        @ Reduce mutexes.
2216    
2217          I was using mutex_lock()/mutex_unlock() so that I can use
2218          atomic_dec_and_test() for removing an element from a list.
2219          I moved that operation to garbage collector in order to reduce frequency
2220          of mutex_lock()/mutex_unlock() calls.
2221    
2222        @ Escape from nested loops correctly.
2223    
2224          In ccs_read_address_group_policy(), I was escaping from nested loops
2225          correctly. But in ccs_read_path_group_policy() and
2226          ccs_read_number_group_policy(), I wasn't.
2227    
2228          As a result, reading path_group and number_group caused kernel oops
2229          when they were not read atomically.
2230    
2231    Fix 2009/11/06
2232    
2233        @ Fix incorrect allow_mount audit log.
2234    
2235          Audit log for allow_mount was using decimal format.
2236          It needs to use hexadecimal format.
2237    
2238    Fix 2009/11/09
2239    
2240        @ Add profile version check.
2241    
2242          To avoid upgrading from TOMOYO 1.6.x to TOMOYO 1.7.x without upgrading
2243          /proc/ccs/profile (which results in not protecting the system at all),
2244          I added a check for PROFILE_VERSION= .
2245    
2246    Version 1.7.1 2009/11/11   Fourth anniversary release.
2247    
2248    Fix 2009/11/13
2249    
2250        @ Don't use core_initcall() for initializing lock for GC.
2251    
2252         Some kernels call TOMOYO's hooks before processing core_initcall().
2253         Thus, I can't use core_initcall() for initializing lock for GC.
2254    
2255    Fix 2009/11/18
2256    
2257        @ Don't check "allow_write" permission for open(O_RDONLY | O_TRUNC).
2258    
2259          Since TOMOYO checks "allow_truncate" permission rather than "allow_write"
2260          permission for O_TRUNC, I need to distinguish open(O_RDONLY | O_TRUNC)
2261          and open(O_RDWR | O_TRUNC). But I made a mistake between TOMOYO 1.7.0 and
2262          1.7.1 which made it impossible for TOMOYO for kernels 2.6.14 and earlier
2263          to distinguish them.
2264    
2265    Fix 2009/11/27
2266    
2267        @ Use newly created domain's name for domain creation audit log.
2268    
2269          Since 1.7.0 , /proc/ccs/reject_log was by error using existing domain's
2270          name when auditing newly created domain's "use_profile" line.
2271    
2272    Fix 2009/12/12
2273    
2274        @ Use rcu_read_lock() for find_task_by_pid().
2275    
2276          Since kernel 2.6.18 , caller of find_task_by_pid() needs to call
2277          rcu_read_lock() rather than read_lock(&tasklist_lock) because find_pid()
2278          uses RCU primitives but spinlock does not prevent RCU callback if
2279          preemptive RCU ( CONFIG_PREEMPT_RCU or CONFIG_TREE_PREEMPT_RCU ) is
2280          enabled.
2281    
2282    Fix 2009/12/15
2283    
2284        @ Allow deleting "quota_exceeded" and "transition_failed" entries.
2285    
2286          To notify users of "this domain has too many entries to hold" and "some
2287          process in this domain was not able to perform domain transition",
2288          "quota_exceeded" and "transition_failed" messages are used respectively.
2289          These messages were not deletable. But it is more convenient for users
2290          to be notified again if such events occurred again after tuning policy.
2291          Thus, I made these messages deletable.
2292    
2293    Fix 2009/12/17
2294    
2295        @ Don't check read permission in ccs_try_alt_exec().
2296    
2297          While I was trying to remove ccs_execve_list list for GC optimization
2298          between TOMOYO 1.7.0 and 1.7.1 , I made a mistake which made TOMOYO to
2299          check allow_read permission of the programs specified by execute_handler
2300          and denied_execute_handler keywords.
2301    
2302        @ Don't check DAC permission if disabled mode.
2303    
2304          I was checking DAC permissions regarding directory entry modification
2305          operations (e.g. mkdir()) even if mode=disabled . It is a waste of CPU
2306          resource to check DAC permissions when MAC permissions are not checked.
2307          Thus, I modified to skip DAC permission checks if mode=disabled .
2308    
2309    Fix 2009/12/19
2310    
2311        @ Fix memory leak in ccs_environ().
2312    
2313          When I fixed a bug that a permission like
2314    
2315            allow_env PATH if exec.envp["PATH"]="/"
2316    
2317          was not working (2009/11/02), I allocated two buffers but only one buffer
2318          was released.
2319    
2320          This bug will trigger OOM killer if environment variable checking is
2321          enabled.
2322    
2323    Fix 2010/01/17
2324    
2325        @ Use current domain's name for execute_handler audit log.
2326    
2327          Since 1.6.7 , /proc/ccs/grant_log was by error using next domain's name
2328          when auditing current domain's "execute_handler" line.
2329    
2330    Fix 2010/03/02
2331    
2332        @ Allow domain transition without execve().
2333    
2334          To be able to split permissions for Apache's CGI programs which are
2335          executed without execve(), I added special domain transition which is
2336          performed by atomically writing '\0'-terminated binary string to
2337          /proc/ccs/.transition interface. For example, a process which belongs to
2338          "<kernel> /usr/sbin/httpd" domain will transit to
2339          "<kernel> /usr/sbin/httpd //app=cgi1\040id=10000" domain by atomically
2340          writing "app=cgi1 id=10000" + '\0' to /proc/ccs/.transition using
2341          Apache's ap_hook_handler() functionality.
2342    
2343          Note that '\0'-terminated binary string is converted to TOMOYO's string
2344          inside kernel and prefix "//" is automatically added to the string so
2345          that domainname does not conflict with domainnames created by execve().
2346          Without this prefix, if "<kernel> /usr/sbin/sshd /bin/bash" domain is
2347          allowed to open /proc/ccs/.transition for writing and
2348          "<kernel> /usr/sbin/sshd /bin/bash /usr/bin/passwd" domain is allowed to
2349          access /etc/shadow , /bin/bash will be able to access /etc/shadow by
2350          atomically writing "/usr/bin/passwd" + '\0' to /proc/ccs/.transition .
2351          Allowing /bin/bash to access /etc/shadow is not what people want.
2352    
2353          Permission for this operation is checked by "allow_transit" keyword.
2354          Unlike "allow_execute" keyword, the string parameter for "allow_transit"
2355          keyword does not refer a real file on filesystem's namespace. Therefore,
2356          you can store any combination of parameters like LDAP's DN entry in the
2357          string parameter for "allow_transit" keyword.
2358    
2359    Fix 2010/03/08
2360    
2361        @ Allow building as loadable kernel module.
2362    
2363          To be able to minimize filesize increment of vmlinux, I made it
2364          possible to compile TOMOYO Linux as loadable kernel module.
2365          Although patching the kernel source and recompiling the kernel are
2366          inevitable, this change will make it easier to enable TOMOYO Linux
2367          when there is a filesize limitation on vmlinux (e.g. embedded systems).
2368    
2369    Fix 2010/03/25
2370    
2371        @ Fix ccs_get_ipv6_address() bug.
2372    
2373          Since 1.7.0 , ccs_get_ipv6_address() was by error returning address of
2374          "struct list_head ccs_address_list" if memory allocation failed.
2375          As a result, ccs_put_ipv6_address() will modify memory near
2376          "struct list_head ccs_address_list" if memory allocation failed.
2377    
2378    Fix 2010/03/26
2379    
2380        @ Fix ccs_lport_reserved() bug.
2381    
2382          Since 1.7.0 , ccs_lport_reserved() was by error checking wrong port
2383          number. As a result, "deny_autobind" keyword was not working as expected.
2384    
2385    Version 1.7.2 2010/04/01   Feature enhancement release.
2386    
2387    Fix 2010/04/10
2388    
2389        @ Fix invalid "struct nameidata" to "struct path" conversion macro.
2390    
2391          Regarding kernels 2.6.24 and earlier, I was converting "struct nameidata"
2392          to "struct path" in caller side so that I can unify the callee function's
2393          parameter type. But it turned out that the macro I used did not follow C
2394          standards and did not work with gcc 4.x . As a result, "allow_pivot_root"
2395          keyword was not working as expected.
2396    
2397    Fix 2010/05/05
2398    
2399        @ Fix incorrect audit on/off control.
2400    
2401          The grant_log= and reject_log= parameters of CONFIG::misc::env were not
2402          used because I forgot to update request type. As a result, those of
2403          CONFIG::file::execute were used for CONFIG::misc::env .
2404    
2405          Those of CONFIG::file::rewrite were not used because I forgot to update
2406          request type. As a result, those of CONFIG::file::truncate were used for
2407          CONFIG::file::rewrite .
2408    
2409    Fix 2010/05/10
2410    
2411        @ Fix incorrect out of memory warning.
2412    
2413          Out of memory warnings were not printed in some cases by error.
2414    
2415    Fix 2010/05/27
2416    
2417        @ Add missing rcu_dereference() for ccs_find_execute_handler().
2418    
2419          Since 1.7.0 , ccs_find_execute_handler() was by error using
2420          list_for_each_entry() rather than list_for_each_entry_rcu().
2421          This bug affects only Alpha architecture.
2422    
2423    Fix 2010/06/03
2424    
2425        @ Fix missing sanity check for "file_pattern".
2426    
2427          Since 1.7.0 , ccs_write_pattern_policy() was by error accepting
2428          invalid pathname.
2429    
2430    Fix 2010/06/09
2431    
2432        @ Add missing ccs_put_name() in ccs_parse_envp().
2433    
2434          Since 1.7.0 , ccs_parse_envp() was not calling ccs_put_name() if
2435          environment variable's value ('if exec.envp["name"]="value"' condition)
2436          was invalid.
2437    
2438        @ Add missing NULL check in ccs_condition().
2439    
2440          Since 1.7.0 , if 'if symlink.target=' part was given against non-file
2441          permissions (e.g. allow_env PATH if symlink.target="/"), it triggered
2442          NULL pointer dereference.
2443    
2444    Fix 2010/10/28
2445    
2446        @ Fix umount() pathname calculation.
2447    
2448          "mount --bind /path/to/file1 /path/to/file2" is legal.
2449          Therefore, "umount /path/to/file2" is also legal.
2450          Do not automatically append trailing '/' if pathname to be unmounted
2451          does not end with '/'.
2452    
2453        @ Add preserve KABI compatibility option. (2.6 kernels only)
2454    
2455          TOMOYO needs "struct ccs_domain_info *" and "u32" for each
2456          "struct task_struct". But embedding these variables into
2457          "struct task_struct" breaks KABI for prebuilt kernel modules (which
2458          means that you will need to rebuild prebuilt kernel modules).
2459    
2460          Since KABI is commonly used (compared to 5 years ago), asking users to
2461          rebuild kernel modules which are not included in kernel package is no
2462          longer preferable. Therefore, I added a new option that keeps
2463          "struct task_struct" unmodified in order to keep KABI.
2464    
2465          Note that you have to use ccs-patch-2.6.\*.diff which patches
2466          kernel/fork.c in order to use this option. Otherwise, TOMOYO will leak
2467          memory whenever "struct task_struct" is released.
2468    
2469        @ Change directives.
2470    
2471          I removed "allow_" prefix from directives. New directives for files are
2472          prefixed with "file ". For example, "allow_read" changed to "file read",
2473          "allow_ioctl" changed to "file ioctl". New directive for "allow_network
2474          TCP" is "network inet stream", "allow_network UDP" is "network inet
2475          dgram", "allow_network RAW" is "network inet raw". New directive for
2476          "allow_env" is "misc env". New directive for "allow_signal" is "ipc
2477          signal". New directive for "allow_capability" is "capability". These new
2478          directives correspond with keywords used by profile's CONFIG lines.
2479    
2480          I removed "deny_rewrite" and "allow_rewrite" directives and introduced
2481          "file append" directive. Thus, permission for open(O_WRONLY | O_APPEND)
2482          changed from "allow_write" + "allow_rewrite" to "file append".
2483    
2484          I removed "SYS_MOUNT", "SYS_UMOUNT", "SYS_CHROOT", "SYS_KILL",
2485          "SYS_LINK", "SYS_SYMLINK", "SYS_RENAME", "SYS_UNLINK", "SYS_CHMOD",
2486          "SYS_CHOWN", "SYS_IOCTL", "SYS_PIVOT_ROOT" keywords from capabilities
2487          because these permissions can be checked by other directives (e.g.
2488          "file mount", "ipc signal").
2489    
2490          I also removed "conceal_mount" keyword from capabilities because this
2491          check requires hooks in filesystem part while almost all hooks for
2492          filesystem part have moved to LSM by Linux 2.6.34.
2493    
2494          New directive for "execute_handler" is "task auto_execute_handler",
2495          "denied_execute_handler" is "task denied_execute_handler".
2496    
2497        @ Distinguish send() and recv() operations.
2498    
2499          Until now, it was impossible for UDP and IP sockets to allow either
2500          only sending or only receiving because permissions were aggregated with
2501          "connect" keyword. I broke "connect" keyword into "send" and "recv"
2502          keywords so that you can keep access control for send() operation enabled
2503          when you have to disable access control for recv() operation due to
2504          application breakage by discarding incoming datagram.
2505    
2506        @ Add Unix domain socket restriction support.
2507    
2508          Until now, it was possible to restrict only inet domain sockets (i.e.
2509          TCP/UDP/RAW). I added restriction for Unix domain sockets (i.e. stream/
2510          dgram/seqpacket). New directive "network unix" is added as well as
2511          "network inet" directive.
2512    
2513        @ Allow specifying multiple permissions in a line.
2514    
2515          Until now, only "allow_read/write" can be specified for combination of
2516          "allow_read" + "allow_write". Now, you can combine other permissions as
2517          long as type of parameters for these permissions is same. For example,
2518          "file read/write/append/execute/unlink/truncate /tmp/file" is correct
2519          but "file read/write/create /tmp/file" is wrong because "file create"
2520          requires create mode whereas "file read" and "file write" do not.
2521    
2522        @ Allow wildcard for execute permission and domainname.
2523    
2524          Until now, to execute programs with temporary names, "aggregator" is
2525          needed. To simplify code, I modified to accept wildcards for execute
2526          permission and domainname. Now, you can directly specify
2527          "file execute /tmp/logrotate.\?\?\?\?\?\?" and use
2528          "/tmp/logrotate.\?\?\?\?\?\?" within domainnames.
2529    
2530        @ Change pathname for non-rename()able filesystems.
2531    
2532          LSM version of TOMOYO wants to use /proc/self/ rather than /proc/$PID/ if
2533          $PID matches current thread's process ID in order to prevent current
2534          thread from accessing other process's information unless needed.
2535          But since procfs can be mounted on various locations (e.g. /proc/ /proc2/
2536          /p/ /tmp/foo/100/p/ ), LSM version of TOMOYO cannot tell that whether the
2537          numeric part in the string returned by __d_path() represents process ID
2538          or not.
2539    
2540          Therefore, to be able to convert from $PID to self no matter where procfs
2541          is mounted, I changed pathname representations for filesystems which do
2542          not support rename() operation (e.g. proc, sysfs, securityfs).
2543    
2544          Now, "/proc/self/mounts" changed to "proc:/self/mounts" and
2545          "/sys/kernel/security/" changed to "sys:/kernel/security/" and
2546          "/dev/pts/0" changed to "devpts:/0".
2547    
2548        @ Add a new keyword "any" for domain transition control.
2549    
2550          To be able to make it easier to apply auto_execute_handler on each
2551          domain, I added "any" keyword to domain transition control keywords. Now,
2552          "initialize_domain /usr/sbin/sshd" changed to
2553          "initialize_domain /usr/sbin/sshd from any" and
2554          "keep_domain <kernel> /usr/sbin/sshd /bin/bash" changed to
2555          "keep_domain any from <kernel> /usr/sbin/sshd /bin/bash".
2556    
2557          "keep_domain /path/to/auto_execute_handler from any" will allow you to
2558          apply auto_execute_handler for any domains without creating domains for
2559          auto_execute_handler.
2560    
2561        @ Change buffering mode for reading policy.
2562    
2563          To be able to read() very very long lines correctly, I changed the way
2564          TOMOYO buffers policy for reading.
2565    
2566        @ Introduce "acl_group" keyword.
2567    
2568          Until now, it was possible to specify only "allow_read" and "allow_env"
2569          keywords in the exception policy.
2570    
2571          Since some operations like "file read/write/append /dev/null" and
2572          "network UDP send/recv @DNS_SERVER 53" are very common and should be
2573          permitted to all domains, I introduced "acl_group" keyword for giving
2574          such permissions.
2575    
2576          For example, specify "acl_group 0 file read/write/append /dev/null" in
2577          the exception policy and specify "use_group 0" from the domains in the
2578          domain policy.
2579    
2580          "ignore_global_allow_read" and "ignore_global_allow_env" directives were
2581          removed from domain policy and "use_group" keyword was added.
2582    
2583        @ Remove "if" and "; set" keyword.
2584    
2585          I removed need for specifying these keyword.
2586          You can simply specify like below.
2587    
2588            file read /etc/shadow task.uid=0
2589    
2590        @ Remove "file_pattern" keyword.
2591    
2592          I removed "file_pattern" keyword because it is impossible to predefine
2593          all possible pathname patterns. Also, learning pathnames using incomplete
2594          patterns makes it difficult to later replace using "path_group" keyword.
2595    
2596        @ Replace verbose= parameter with statistic interface.
2597    
2598          Since it is noisy if a lot of policy violation messages are printed,
2599          I removed printk(). To be able to check whether policy violation occurred
2600          or not, I introduced /proc/ccs/stat interface which counts number of
2601          policy violations occurred. You can firstly check /proc/ccs/stat and then
2602          check /proc/ccs/reject_log .
2603    
2604        @ Remove global preference.
2605    
2606          I removed global preference in order to make code simpler.
2607    
2608        @ Allow controlling generation of access granted logs for per an entry
2609          basis.
2610    
2611          I added per-entry flag which controls generation of grant logs because
2612          Xen and KVM issues ioctl requests so frequently. For example,
2613    
2614            file ioctl /dev/null 0x5401 grant_log=no
2615    
2616          will suppress /proc/ccs/grant_log even if preference says grant_log=yes .
2617    
2618            file ioctl /dev/null 0x5401 grant_log=yes
2619    
2620          will generate /proc/ccs/grant_log even if preference says grant_log=no .
2621    
2622            file ioctl /dev/null 0x5401
2623    
2624          will generate /proc/ccs/grant_log only if preference says grant_log=yes .
2625    
2626          This flag is intended for frequently accessed resources like
2627    
2628            file read /var/www/html/\{\*\}/\*.html grant_log=no
2629    
2630          .
2631    
2632        @ Automatically create domain by execve() even if enforcing mode.
2633    
2634          Until now, new domains are not created if the domain was not defined and
2635          current domain is enforcing mode ("CONFIG::file::execute=enforcing").
2636    
2637          To be able to restrict shell session without using "keep_domain",
2638          I changed to create new domains automatically even if current domain is
2639          enforcing mode.
2640    
2641        @ Replace "task.state" with "auto_domain_transition".
2642    
2643          task.state is difficult to use. Thus, I replaced task.state with
2644          auto_domain_transition which performs domain transition instead of
2645          changing current process's state variables.
2646    
2647          If domain transition failed, current process will be killed by SIGKILL
2648          signal. This should not happen in normal circumstances, for you know the
2649          domain to transit to and thereby you will define the domain beforehand
2650          when you use "auto_domain_transition" keyword.
2651    
2652        @ Replace "allow_transit" with "task manual_domain_transition".
2653    
2654          I changed this directive to specify absolute domainname (e.g.
2655          "<kernel> /usr/sbin/httpd //app=cgi1\040id=10000") rather than virtual
2656          pathname (e.g. "//app=cgi1\040id=10000") because you know the domain to
2657          transit to and thereby you will define the domain beforehand when you use
2658          "task manual_domain_transition" directive.
2659    
2660          This change allows you to jump to arbitrary domain.
2661    
2662          Note that this change also reverts "Change /proc/ccs/info/self_domain ."
2663          made on 2006/10/24. Now, 'cat < /proc/ccs/info/self_domain' will act like
2664          'cat /proc/ccs/info/self_domain'. Programs depending on old assumption
2665          need to be updated.
2666    
2667        @ Add "task auto_domain_transition".
2668    
2669          This is similar to "task manual_domain_transition", but is automatically
2670          applied whenever conditions are met. For example,
2671    
2672            task auto_domain_transition <kernel> //./non-root task.uid!=0
2673    
2674          will automatically jump to "<kernel> //./non-root" domain if current
2675          process's UID is not 0 whereas
2676    
2677            task manual_domain_transition <kernel> //./non-root task.uid!=0
2678    
2679          will jump to "<kernel> //./non-root" domain if current process's UID is
2680          not 0 and current process wrote "<kernel> //./non-root" to
2681          /proc/ccs/self_domain interface.
2682    
2683          If domain transition failed, current process will be killed by SIGKILL
2684          signal.
2685    
2686        @ Optimize for object's size.
2687    
2688          I merged similar code in order to reduce object's filesize.
2689    
2690    Version 1.8.0 2010/11/11   Fifth anniversary release.
2691    
2692    Fix 2010/12/01
2693    
2694        @ Use same interface for audit logs.
2695    
2696          To be able to perform fine grained filtering by /usr/sbin/ccs-auditd ,
2697          I merged /proc/ccs/grant_log and /proc/ccs/reject_log as
2698          /proc/ccs/audit and added granted=yes or granted=no to audit logs.
2699    
2700    Fix 2010/12/17
2701    
2702        @ Split ccs_null_security into ccs_default_security and ccs_oom_security.
2703    
2704          ccs_null_security is used by preserve KABI compatibility option and is
2705          used for providing default values against threads which have not yet
2706          allocated memory for their security contexts.
2707    
2708          If current thread failed to allocate memory for current thread's security
2709          context, current thread uses ccs_null_security. Since current thread is
2710          allowed to modify current thread's security context, current thread might
2711          modify ccs_null_security which should not be modified for any reason.
2712    
2713          Therefore, I split ccs_null_security into ccs_default_security and
2714          ccs_oom_security and use ccs_oom_security when current thread failed to
2715          allocate memory for current thread's security context.
2716    
2717          Threads which do not share ccs_oom_security are not affected by threads
2718          which share ccs_oom_security. Threads which share ccs_oom_security will
2719          experience temporary inconsistency, but such threads are about to be
2720          killed by SIGKILL signal.
2721    
2722    Fix 2011/01/11
2723    
2724        @ Use filesystem name for unnamed devices when vfsmount is missing.
2725    
2726          "Change pathname for non-rename()able filesystems." changed to use
2727          "$fsname:" if the filesystem does not support rename() operation and
2728          "dev($major,$minor):" otherwise when vfsmount is missing. But it turned
2729          out that it is useless to use "dev($major,$minor):" for unnamed devices
2730          (filesystems with $major == 0). Thus, I changed to use "$fsname:" rather
2731          than "dev($major,$minor):" for filesystems with $major == 0 when vfsmount
2732          is missing.
2733    
2734    Fix 2011/02/07
2735    
2736        @ Fix infinite loop bug when reading /proc/ccs/audit or /proc/ccs/query .
2737    
2738          In ccs_flush(), head->r.w[0] holds pointer to string data to be printed.
2739          But head->r.w[0] was updated only when the string data was partially
2740          printed (because head->r.w[0] will be updated by head->r.w[1] later if
2741          completely printed). However, regarding /proc/ccs/audit and
2742          /proc/ccs/query , an additional '\0' is printed after the string data was
2743          completely printed. But if free space for read buffer became 0 before
2744          printing the additional '\0', ccs_flush() was returning without updating
2745          head->r.w[0]. As a result, ccs_flush() forever reprints already printed
2746          string data.
2747    
2748    Fix 2011/03/01
2749    
2750        @ Run garbage collector without waiting for /proc/ccs/ users.
2751    
2752          Currently TOMOYO holds SRCU lock upon open() and releases it upon close()
2753          because list elements stored in the "struct ccs_io_buffer" instances are
2754          accessed until close() is called. However, such SRCU usage causes lockdep
2755          to complain about leaving the kernel with SRCU lock held. Therefore,
2756          I changed to hold/release SRCU upon each read()/write() by selectively
2757          deferring kfree() by keeping track of the "struct ccs_io_buffer"
2758          instances.
2759    
2760    Fix 2011/03/05
2761    
2762        @ Support built-in policy configuration.
2763    
2764          To be able to start using enforcing mode from the early stage of boot
2765          sequence, I added support for built-in policy configuration and
2766          activating access control without calling external policy loader program.
2767    
2768          This will be useful for systems where operations which can lead to the
2769          hijacking of the boot sequence are needed before loading the policy.
2770          For example, you can activate immediately after loading the fixed part of
2771          policy which will allow only operations needed for mounting a partition
2772          which contains the variant part of policy and verifying (e.g. running GPG
2773          check) and loading the variant part of policy. Since you can start using
2774          enforcing mode from the beginning, you can reduce the possibility of
2775          hijacking the boot sequence.
2776    
2777    Fix 2011/03/10
2778    
2779        @ Remove /proc/ccs/meminfo interface.
2780    
2781          Please use /proc/ccs/stat interface instead.
2782    
2783    Fix 2011/03/15
2784    
2785        @ Pack policy when printing via /proc/ccs/ interface.
2786    
2787          The kernel side is ready for accepting packed input like
2788    
2789            file read/write/execute /path/to/file
2790    
2791          but was using unpacked output like
2792    
2793            file read /path/to/file
2794            file write /path/to/file
2795            file execute /path/to/file
2796    
2797          because most of userland tools were not ready for accepting packed input.
2798    
2799          The advantages of using packed policy are that it makes policy files
2800          smaller and it speeds up loading/saving policy files.
2801    
2802          Since most of userland tools are ready for accepting packed input by now,
2803          I changed to use packed policy for both input and output.

Legend:
Removed from v.1014  
changed lines
  Added in v.4724

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26