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

Subversion リポジトリの参照

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

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

revision 1657 by kumaneko, Tue Oct 7 02:21:32 2008 UTC revision 2562 by kumaneko, Tue May 19 01:11:55 2009 UTC
# Line 475  Fix 2006/08/04 Line 475  Fix 2006/08/04
475        succeeds to invoke do_execve() with filename = "/bin/ls" and        succeeds to invoke do_execve() with filename = "/bin/ls" and
476        argv[0] = "/bin/cat".        argv[0] = "/bin/cat".
477    
478        I introduced a keyword that permits the mismatch of        I introduced a directive that permits the mismatch of
479        basename of filename and argv[0].        basename of filename and argv[0].
480    
481  Fix 2006/08/10  Fix 2006/08/10
# Line 1259  Fix 2008/02/29 Line 1259  Fix 2008/02/29
1259    
1260  Fix 2008/03/03  Fix 2008/03/03
1261    
1262      @ Add "force_alt_exec" keyword.      @ Add "force_alt_exec" directive.
1263    
1264        To be able to fully utilize "alt_exec" feature,        To be able to fully utilize "alt_exec" feature,
1265        I added "force_alt_exec" keyword so that        I added "force_alt_exec" directive so that
1266        all execute requests are replaced by the execute request of a program        all execute requests are replaced by the execute request of a program
1267        specified by alt_exec feature.        specified by alt_exec feature.
1268    
1269        If this keyword is specified for a domain, the domain no longer        If this directive is specified for a domain, the domain no longer
1270        executes any programs regardless of the mode of file access control        executes any programs regardless of the mode of file access control
1271        (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 ).
1272        Instead, the domain executes the program specified by alt_exec feature        Instead, the domain executes the program specified by alt_exec feature
# Line 1301  Fix 2008/03/04 Line 1301  Fix 2008/03/04
1301    
1302  Fix 2008/03/10  Fix 2008/03/10
1303    
1304      @ Rename "force_alt_exec" keyword to "execute_handler".      @ Rename "force_alt_exec" directive to "execute_handler".
1305    
1306        To be able to use different programs for validating execve() parameters,        To be able to use different programs for validating execve() parameters,
1307        I moved the location to specify the program's pathname from profile        I moved the location to specify the program's pathname from profile
1308        to domain policy.        to domain policy.
1309    
1310        The "execute_handler" keyword takes one pathname which is        The "execute_handler" directive takes one pathname which is
1311        invoked whenever execve() request is issued. Thus, any "allow_execute"        invoked whenever execve() request is issued. Thus, any "allow_execute"
1312        keywords in a domain with "execute_handler" are ignored.        directives in a domain with "execute_handler" are ignored.
1313        This keyword is designed for validating expected/desirable execve()        This directive is designed for validating expected/desirable execve()
1314        requests in userspace, although there is no way to tell the caller        requests in userspace, although there is no way to tell the caller
1315        that the execve() request was rejected.        that the execve() request was rejected.
1316    
1317      @ Rename "alt_exec" keyword to "denied_execute_handler".      @ Rename "alt_exec" directive to "denied_execute_handler".
1318    
1319        The "denied_execute_handler" keyword takes one pathname which is        The "denied_execute_handler" directive takes one pathname which is
1320        invoked only when execve() request was rejected. In other words,        invoked only when execve() request was rejected. In other words,
1321        this program is invoked only when the following conditions are met.        this program is invoked only when the following conditions are met.
1322    
1323          (1) None of "allow_execute" keywords in the domain matched.          (1) None of "allow_execute" directives in the domain matched.
1324          (2) The execve() request was rejected in enforcing mode.          (2) The execve() request was rejected in enforcing mode.
1325          (3) "execute_handler" keyword is not used by the domain.          (3) "execute_handler" directive is not used by the domain.
1326    
1327        This keyword is designed for handling unexpected/undesirable execve()        This directive is designed for handling unexpected/undesirable execve()
1328        requests, to redirect the process issuing such requests to somewhere.        requests, to redirect the process issuing such requests to somewhere.
1329    
1330  Fix 2008/03/18  Fix 2008/03/18
# Line 1342  Fix 2008/03/28 Line 1342  Fix 2008/03/28
1342      @ Disable execute handler loop.      @ Disable execute handler loop.
1343    
1344        To be able to use "execute_handler" in a "keep_domain" domain,        To be able to use "execute_handler" in a "keep_domain" domain,
1345        ignore "execute_handler" and "denied_execute_handler" keywords        ignore "execute_handler" and "denied_execute_handler" directives
1346        if the current process is executing programs specified by        if the current process is executing programs specified by
1347        "execute_handler" or "denied_execute_handler" keyword.        "execute_handler" or "denied_execute_handler" directive.
1348    
1349        This exception is needed to avoid infinite execute handler loop.        This exception is needed to avoid infinite execute handler loop.
1350        If a domain has both "keep_domain" and "execute_handler",        If a domain has both "keep_domain" and "execute_handler",
# Line 1501  Fix 2008/06/25 Line 1501  Fix 2008/06/25
1501      @ Return 0 when ccs_may_umount() succeeds.      @ Return 0 when ccs_may_umount() succeeds.
1502    
1503        I forgot to clear error value in ccs_may_umount() when the requested        I forgot to clear error value in ccs_may_umount() when the requested
1504        directory didn't match "deny_unmount" keyword. As a result, any umount()        directory didn't match "deny_unmount" directive. As a result, any umount()
1505        request with RESTRICT_UNMOUNT=enforcing returned -EPERM error.        request with RESTRICT_UNMOUNT=enforcing returned -EPERM error.
1506    
1507  Version 1.6.2 2008/06/25   Usability enhancement release.  Version 1.6.2 2008/06/25   Usability enhancement release.
# Line 1630  Fix 2008/10/07 Line 1630  Fix 2008/10/07
1630      @ Don't transit to new domain until do_execve() succeeds.      @ Don't transit to new domain until do_execve() succeeds.
1631    
1632        Until now, a process's domain was updated to new domain which the process        Until now, a process's domain was updated to new domain which the process
1633        will belongs to before do_execve() succeeds so that the kernel can do        will belong to before do_execve() succeeds so that the kernel can do
1634        permission checks for interpreters and environment variables based on        permission checks for interpreters and environment variables based on
1635        new domain. But this caused a subtle problem when other process sends        new domain. But this caused a subtle problem when other process sends
1636        signals to the process, for the process returns to old domain if        signals to the process, for the process returns to old domain if
# Line 1651  Fix 2008/10/07 Line 1651  Fix 2008/10/07
1651        As the number of parameters is increasing, I modified to use a structure        As the number of parameters is increasing, I modified to use a structure
1652        for passing parameters.        for passing parameters.
1653    
1654      @ Always allow updating task state for signal operations.  Fix 2008/10/11
1655    
1656        ccs_check_signal_acl() was skipping permission checks if signal is NULL      @ Remove domain_acl_lock mutex.
1657        or sent to self or sent to same domain. To make it possible to update  
1658        task state when current process is sending NULL signal or to self or        I noticed that I don't need to keep all functions that modify an ACL of
1659        to same domain, I modified to check ACL anyway. The result of access        a domain mutually exclusive. Since each functions handles different type
1660        control will not change, but this modification will generate granted logs        of ACL, locking is needed only when they append an ACL to a domain.
1661        which were not generated until now.        So, I modified to use local locks.
1662    
1663    Fix 2008/10/14
1664    
1665        @ Fix ccs_check_condition() bug.
1666    
1667          Due to a bug in ccs_check_condition(), it was impossible to use
1668          task.state[0] task.state[1] task.state[2] inside condition part
1669          if the ACL does not treat a pathname. For example, an ACL like
1670    
1671            allow_network TCP connect @HTTP_SERVERS 80 if task.state[0]=100
1672    
1673          didn't work.
1674    
1675    Fix 2008/10/15
1676    
1677        @ Show process information in /proc/ccs/.process_status .
1678    
1679          To be able to determine a process's type, I added a command "info PID"
1680          which returns process information of the specified PID in
1681          "PID manager=\* execute_handler=\* state[0]=\$ state[1]=\$ state[2]=\$"
1682          format.
1683    
1684    Fix 2008/10/20
1685    
1686        @ Use rcu_dereference() when walking the list.
1687    
1688          I was using "dependency ordering" for appending an element to a list
1689          without asking the reader to take a lock. But "dependency ordering"
1690          is not respected by DEC Alpha or by some aggressive value-speculation
1691          compiler optimizations.
1692    
1693          On such environment, use of "dependency ordering" can lead to system
1694          crash because the reader might read uninitialized value of newly
1695          appended element.
1696    
1697          To prevent the reader from reading uninitialized value of newly appended
1698          element, I inserted rcu_dereference() when walking the list.
1699    
1700    Fix 2008/11/04
1701    
1702        @ Use sys_getpid() instead for current->pid.
1703    
1704          Kernel 2.6.24 introduced PID namespace.
1705    
1706          To compare PID given from userland, I can't use current->pid.
1707          So, I modified to use sys_getpid() instead for current->pid.
1708    
1709          I modified to use task_tgid_nr_ns() for 2.6.25 and later instead for
1710          current->tgid when checking /proc/self/ in get_absolute_path().
1711    
1712    Fix 2008/11/07
1713    
1714        @ Fix is_alphabet_char().
1715    
1716          is_alphabet_char() should match 'A' - 'Z' and 'a' - 'z',
1717          but was matching from 'A' - 'F' and 'a' - 'f'.
1718    
1719        @ Add /proc/ccs/.execute_handler .
1720    
1721          Process information became visible to userspace by
1722          "Show process information in /proc/ccs/.process_status" feature.
1723          However, programs specified by execute_handler directive may run as
1724          non root user, making it impossible to see process information.
1725    
1726          So, I added a new interface that allows execute handler processes
1727          to see process information. The content of /proc/ccs/.execute_handler is
1728          identical to /proc/ccs/.process_status .
1729    
1730    Version 1.6.5   2008/11/11   Third anniversary release.
1731    
1732    Fix 2008/12/01
1733    
1734        @ Introduce "task.type=execute_handler" condition.
1735    
1736          The execute_handler directive is very very powerful. You can use this
1737          directive to do anything you want to do (e.g. logging and validating and
1738          modifying command line parameters and environment variables, opening and
1739          closing and redirecting files, creating pipes to implement antivirus and
1740          spam filtering, deploying a DMZ between the ssh daemon and the login
1741          shells).
1742    
1743          To be able to use this directive in a domain with keep_domain directive
1744          while limiting access to resources needed for such purposes to only
1745          programs invoked as an execute handler process, I added a new condition.
1746    
1747          In learning mode, "if task.type=execute_handler" condition part will be
1748          automatically added for requests issued by an execute_handler process.
1749    
1750        @ Introduce file's type and permissions as conditions.
1751    
1752          To be able to limit file types a process can access, I added
1753          new conditions for checking file's type and permissions.
1754          For example,
1755    
1756            allow_read /etc/fstab if path1.type=file path1.perm=0644
1757    
1758          will allow opening /etc/fstab for reading only if /etc/fstab is a regular
1759          file and it's permission is 0644, and
1760    
1761            allow_write /dev/null if path1.type=char path1.dev_major=1 path1.dev_minor=3
1762    
1763          will allow opening /dev/null for writing only if /dev/null is a character
1764          device file with major=1 and minor=3 attributes.
1765    
1766        @ Add memory quota for temporary memory used for auditing.
1767    
1768          Although there are MAX_GRANT_LOG and MAX_REJECT_LOG parameters
1769          which limit the number of entries for audit logs so that we can avoid
1770          memory consumption by audit logs, it would be more convenient if we can
1771          also limit the size in bytes.
1772          Thus, I added a new quota line.
1773    
1774            echo Dynamic: 1048576 > /proc/ccs/meminfo
1775    
1776          This quota is not applied to temporary memory used for permission checks.
1777    
1778    Fix 2008/12/09
1779    
1780        @ Fix ccs_can_save_audit_log() checks.
1781    
1782          Due to incorrect statement "if (ccs_can_save_audit_log() < 0)"
1783          while ccs_can_save_audit_log() is boolean, MAX_GRANT_LOG and
1784          MAX_REJECT_LOG were not working.
1785    
1786          This bug will trigger OOM killer if /usr/sbin/ccs-auditd is not working.
1787    
1788    Fix 2008/12/24
1789    
1790        @ Add "ccs_" prefix.
1791    
1792          To be able to tell whether a symbol is TOMOYO Linux related or not,
1793          I added "ccs_" prefix as much as possible.
1794    
1795        @ Fix ccs_check_flags() error message.
1796    
1797          I meant to print SYAORAN-ERROR: message when error == -EPERM,
1798          but I was printing it when error == 0 since 1.6.0 .
1799    
1800    Fix 2009/01/05
1801    
1802        @ Use kmap_atomic()/kunmap_atomic() for reading "struct linux_binprm".
1803    
1804          As remove_arg_zero() uses kmap_atomic(KM_USER0), I modified to use
1805          kmap_atomic(KM_USER0) rather than kmap().
1806    
1807    Fix 2009/01/28
1808    
1809        @ Fix "allow_read" + "allow_write" != "allow_read/write" problem.
1810    
1811          Since 1.6.0 , due to a bug in ccs_update_single_path_acl(),
1812          appending "allow_read/write" entry didn't update internal "allow_read"
1813          and "allow_write" entries. As a result, attempt to open(O_RDWR) succeeds
1814          but open(O_RDONLY) and open(O_WRONLY) fail.
1815    
1816          Workaround is to write an entry twice when newly appending that entry.
1817          If written twice, internal "allow_read" and "allow_write" entries
1818          are updated.
1819    
1820    Fix 2009/02/26
1821    
1822        @ Fix profile read error.
1823    
1824          Incorrect profiles were shown in /proc/ccs/profile
1825          if either CONFIG_SAKURA or CONFIG_TOMOYO is disabled.
1826    
1827    Fix 2009/03/02
1828    
1829        @ Undelete CONFIG_TOMOYO_AUDIT option.
1830    
1831          While HDD-less systems can use profiles with MAX_GRANT_LOG=0 and
1832          MAX_REJECT_LOG=0 , I undeleted CONFIG_TOMOYO_AUDIT option for saving
1833          memory used for /proc/ccs/grant_log and /proc/ccs/reject_log interfaces.
1834    
1835    Fix 2009/03/13
1836    
1837        @ Show only profile entry names ever specified.
1838    
1839          Even if an administrator specifies only COMMENT= and MAC_FOR_FILE=
1840          entries for /proc/ccs/profile , all available profile entries are shown.
1841          This was designed to help administrators to know what entries are
1842          available, but sometimes makes administrators feel noisy because of
1843          entries showing default values.
1844    
1845          Thus, I modified to show only profile entry names ever specified.
1846    
1847    Fix 2009/03/18
1848    
1849        @ Add MAC_FOR_IOCTL functionality.
1850    
1851          To be able to restrict ioctl() requests, I added MAC_FOR_IOCTL
1852          functionality.
1853    
1854          This functionality requires modification of ccs-patch-\*.diff .
1855    
1856        @ Use better name for socket's pathname.
1857    
1858          Until now, socket's pathname was represented as "socket:[\$]" format
1859          where \$ is inode's number. But inode's number is useless for name based
1860          access control. Therefore, I modified to represent socket's pathname as
1861          "socket:[family=\$:type=\$:protocol=\$]" format.
1862    
1863          This will help administrator to control ioctl() against sockets more
1864          precisely.
1865    
1866        @ Fix misplaced ccs_capable() call.  (only 2.6.8-\* and 2.6.9-\*)
1867    
1868          Location to insert ccs_capable(TOMOYO_SYS_IOCTL) in sys_ioctl() was
1869          wrong since version 1.1 .
1870    
1871        @ Insert ccs_check_ioctl_permission() call.
1872    
1873          To make MAC_FOR_IOCTL functionality working, I inserted
1874          ccs_check_ioctl_permission() call into ccs-patch-\*.diff .
1875    
1876    Fix 2009/03/23
1877    
1878        @ Move sysctl()'s check from ccs-patch-\*.diff to fs/tomoyo_file.c .
1879    
1880          Since try_parse_table() in kernel/sysctl.c is almost identical between
1881          all versions, I moved that function to fs/tomoyo_file.c .
1882    
1883        @ Relocate definitions and functions.
1884    
1885          To reduce exposed symbols, I relocated some definitions and functions.
1886    
1887    Fix 2009/03/24
1888    
1889        @ Add CONFIG_TOMOYO_BUILTIN_INITIALIZERS option.
1890    
1891          Some systems don't have /sbin/modprobe and /sbin/hotplug .
1892          Thus, I made these pathnames configurable.
1893    
1894    Version 1.6.7 2009/04/01   Feature enhancement release.
1895    
1896    Fix 2009/04/06
1897    
1898        @ Drop "undelete domain" command.
1899    
1900          I added "undelete domain" command on 2007/01/19, but never used by policy
1901          management tools. The garbage collector I added on 2007/01/29 will
1902          automatically reuse memory and allow administrators switch domain policy
1903          periodically, provided that the administrator kills processes in old
1904          domains before recreating new domains with the same domainnames.
1905    
1906          Thus, I dropped "undelete domain" command.
1907    
1908        @ Escape invalid characters in ccs_check_mount_permission2().
1909    
1910          ccs_check_mount_permission2() was passing unencoded strings to printk()
1911          and ccs_update_mount_acl() and ccs_check_supervisor(). This may cause
1912          /proc/ccs/system_policy and /proc/ccs/query to contain invalid
1913          characters within a string.
1914    
1915    Fix 2009/04/07
1916    
1917        @ Fix IPv4's "address_group" handling error.
1918    
1919          Since 1.6.5 , due to lack of ntohl() (byte order conversion) in
1920          ccs_update_address_group_entry(), "address_group" with IPv4 address was
1921          not working.
1922    
1923          This problem happens on little endian platforms (e.g. x86).
1924    
1925    Fix 2009/04/20
1926    
1927        @ Update recvmsg() hooks.
1928    
1929          Since 1.5.0, I was doing network access control for incoming UDP and RAW
1930          packets inside skb_recv_datagram(). But to synchronize with LSM version,
1931          I moved ccs_recv_datagram_permission() hook from skb_recv_datagram() to
1932          udp_recvmsg()/udpv6_recvmsg()/raw_recvmsg()/rawv6_recvmsg() with name
1933          change to ccs_recvmsg_permission().
1934    
1935    Fix 2009/05/08
1936    
1937        @ Add condition for symlink's target pathname.
1938    
1939          Until now, "allow_symlink" keyword allows creation of a symlink but does
1940          not check the symlink's target. Usually it is no problem because
1941          permission checks are done using dereferenced pathname. But in some
1942          cases, we should restrict the symlink's target. For example,
1943          "ln -s .htpasswd /var/www/html/readme.html" by CGI program should be
1944          blocked because we will allow Apache to read both
1945          /var/www/html/readme.html and /var/www/html/.htpasswd .
1946    
1947          Thus, I added new condition, "symlink.target".
1948    
1949            allow_symlink /var/www/html/\*.html if symlink.target="\*.html"
1950    
1951            allow_symlink /var/www/html/\*\-.\* if symlink.target="\*\-.\*"
1952    
1953        @ Don't return -EAGAIN at ccs_socket_recvmsg_permission().
1954    
1955          It turned out that it is not permitted for accept() and recvmsg() to
1956          return -EAGAIN if poll() said connections/datagrams are ready. However,
1957          recvmsg() may return -EAGAIN and potentially confuse some applications
1958          because ccs_socket_recvmsg_permission() is returning -EAGAIN.
1959    
1960          Thus, I modified ccs_socket_recvmsg_permission() to return -ENOMEM
1961          rather than -EAGAIN.
1962    
1963    Fix 2009/05/19
1964    
1965        @ Don't call get_fs_type() with a mutex held.
1966    
1967          Until now, when ccs_update_mount_acl() is called with unsupported
1968          filesystem, /sbin/modprobe is executed from get_fs_type() to load
1969          filesystem module. And get_fs_type() does not return until /sbin/modprobe
1970          finishes.
1971    
1972          This means that it will cause deadlock if /sbin/modprobe (which is
1973          executed via get_fs_type() in ccs_update_mount_acl()) calls
1974          ccs_update_mount_acl(); although it won't happen unless an administrator
1975          inserts execute_handler to call mount() requests in learning mode or to
1976          add "allow_mount" entries to /proc/ccs/system_policy .
1977    
1978          I modified to unlock the mutex before calling get_fs_type().
1979    
1980    Version 1.6.8 2009/05/??   Feature enhancement release.

Legend:
Removed from v.1657  
changed lines
  Added in v.2562

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