Home | History | Annotate | Download | only in docs
      1 Container Statements
      2 ====================
      3 
      4 block
      5 -----
      6 
      7 Start a new namespace where any CIL statement is valid.
      8 
      9 **Statement definition:**
     10 
     11     (block block_id
     12         cil_statement
     13         ...
     14     )
     15 
     16 **Where:**
     17 
     18 <table>
     19 <colgroup>
     20 <col width="25%" />
     21 <col width="75%" />
     22 </colgroup>
     23 <tbody>
     24 <tr class="odd">
     25 <td align="left"><p><code>block</code></p></td>
     26 <td align="left"><p>The <code>block</code> keyword.</p></td>
     27 </tr>
     28 <tr class="even">
     29 <td align="left"><p><code>block_id</code></p></td>
     30 <td align="left"><p>The namespace identifier.</p></td>
     31 </tr>
     32 <tr class="odd">
     33 <td align="left"><p><code>cil_statement</code></p></td>
     34 <td align="left"><p>Zero or more valid CIL statements.</p></td>
     35 </tr>
     36 </tbody>
     37 </table>
     38 
     39 **Example:**
     40 
     41 See the [`blockinherit`](cil_container_statements.md#blockinherit) statement for an example.
     42 
     43 blockabstract
     44 -------------
     45 
     46 Declares the namespace as a 'template' and does not generate code until instantiated by another namespace that has a [`blockinherit`](cil_container_statements.md#blockinherit) statement.
     47 
     48 **Statement definition:**
     49 
     50     (block block_id
     51         (blockabstract template_id)
     52         cil_statement
     53         ...
     54     )
     55 
     56 **Where:**
     57 
     58 <table>
     59 <colgroup>
     60 <col width="25%" />
     61 <col width="75%" />
     62 </colgroup>
     63 <tbody>
     64 <tr class="odd">
     65 <td align="left"><p><code>block</code></p></td>
     66 <td align="left"><p>The <code>block</code> keyword.</p></td>
     67 </tr>
     68 <tr class="even">
     69 <td align="left"><p><code>block_id</code></p></td>
     70 <td align="left"><p>The namespace identifier.</p></td>
     71 </tr>
     72 <tr class="odd">
     73 <td align="left"><p><code>blockabstract</code></p></td>
     74 <td align="left"><p>The <code>blockabstract</code> keyword.</p></td>
     75 </tr>
     76 <tr class="even">
     77 <td align="left"><p><code>template_id</code></p></td>
     78 <td align="left"><p>The abstract namespace identifier. This must match the <code>block_id</code> entry.</p></td>
     79 </tr>
     80 <tr class="odd">
     81 <td align="left"><p><code>cil_statement</code></p></td>
     82 <td align="left"><p>Zero or more valid CIL statements forming the abstract block.</p></td>
     83 </tr>
     84 </tbody>
     85 </table>
     86 
     87 **Example:**
     88 
     89 See the [`blockinherit`](cil_container_statements.md#blockinherit) statement for an example.
     90 
     91 blockinherit
     92 ------------
     93 
     94 Used to add common policy rules to the current namespace via a template that has been defined with the [`blockabstract`](cil_container_statements.md#blockabstract) statement. All [`blockinherit`](cil_container_statements.md#blockinherit) statements are resolved first and then the contents of the block are copied. This is so that inherited blocks will not be inherited. For a concrete example, please see the examples section.
     95 
     96 **Statement definition:**
     97 
     98     (block block_id
     99         (blockinherit template_id)
    100         cil_statement
    101         ...
    102     )
    103 
    104 **Where:**
    105 
    106 <table>
    107 <colgroup>
    108 <col width="25%" />
    109 <col width="75%" />
    110 </colgroup>
    111 <tbody>
    112 <tr class="odd">
    113 <td align="left"><p><code>block</code></p></td>
    114 <td align="left"><p>The <code>block</code> keyword.</p></td>
    115 </tr>
    116 <tr class="even">
    117 <td align="left"><p><code>block_id</code></p></td>
    118 <td align="left"><p>The namespace identifier.</p></td>
    119 </tr>
    120 <tr class="odd">
    121 <td align="left"><p><code>blockinherit</code></p></td>
    122 <td align="left"><p>The <code>blockinherit</code> keyword.</p></td>
    123 </tr>
    124 <tr class="even">
    125 <td align="left"><p><code>template_id</code></p></td>
    126 <td align="left"><p>The inherited namespace identifier.</p></td>
    127 </tr>
    128 <tr class="odd">
    129 <td align="left"><p><code>cil_statement</code></p></td>
    130 <td align="left"><p>Zero or more valid CIL statements.</p></td>
    131 </tr>
    132 </tbody>
    133 </table>
    134 
    135 **Example:**
    136 
    137 This example contains a template `client_server` that is instantiated in two blocks (`netserver_app` and `netclient_app`):
    138 
    139     ; This is the template block:
    140     (block client_server
    141         (blockabstract client_server)
    142 
    143         ; Log file labeling
    144         (type log_file)
    145         (typeattributeset file_type (log_file))
    146         (typeattributeset data_file_type (log_file))
    147         (allow process log_file (dir (write search create setattr add_name)))
    148         (allow process log_file (file (create open append getattr setattr)))
    149         (roletype object_r log_file)
    150         (context log_file_context (u object_r log_file low_low))
    151 
    152         ; Process labeling
    153         (type process)
    154         (typeattributeset domain (process))
    155         (call app_domain (process))
    156         (call net_domain (process))
    157     )
    158 
    159     ; This is a policy block that will inherit the abstract block above:
    160     (block netclient_app
    161         ; Add common policy rules to namespace:
    162         (blockinherit client_server)
    163         ; Label the log files
    164         (filecon "/data/data/com.se4android.netclient/.*" file log_file_context)
    165     )
    166 
    167     ; This is another policy block that will inherit the abstract block above:
    168     (block netserver_app
    169        ; Add common policy rules to namespace:
    170         (blockinherit client_server)
    171 
    172         ; Label the log files
    173         (filecon "/data/data/com.se4android.netserver/.*" file log_file_context)
    174     )
    175 
    176     ; This is an example of how blockinherits resolve inherits before copying
    177     (block a
    178         (type one))
    179 
    180     (block b
    181         ; Notice that block a is declared here as well
    182         (block a
    183             (type two)))
    184 
    185     ; This will first copy the contents of block b, which results in type b.a.two being copied.
    186     ; Next, the contents of block a will be copied which will result in type a.one.
    187     (block ab
    188         (blockinherit b)
    189         (blockinherit a))
    190 
    191 optional
    192 --------
    193 
    194 Declare an [`optional`](cil_container_statements.md#optional) namespace. All CIL statements in the optional block must be satisfied before instantiation in the binary policy. [`tunableif`](cil_conditional_statements.md#tunableif) and [`macro`](cil_call_macro_statements.md#macro) statements are not allowed in optional containers. The same restrictions apply to CIL policy statements within [`optional`](cil_container_statements.md#optional)'s that apply to kernel policy statements, i.e. only the policy statements shown in the following table are valid:
    195 
    196 |                     |                |                    |                    |
    197 | ------------------- | -------------- | ------------------ | ------------------ |
    198 | [`allow`](cil_access_vector_rules.md#allow)             | [`allowx`](cil_access_vector_rules.md#allowx)       | [`auditallow`](cil_access_vector_rules.md#auditallow)       | [`auditallowx`](cil_access_vector_rules.md#auditallowx)      |
    199 | [`booleanif`](cil_conditional_statements.md#booleanif)         | [`dontaudit`](cil_access_vector_rules.md#dontaudit)    | [`dontauditx`](cil_access_vector_rules.md#dontauditx)       | [`typepermissive`](cil_type_statements.md#typepermissive)   |
    200 | [`rangetransition`](cil_mls_labeling_statements.md#rangetransition)   | [`role`](cil_role_statements.md#role)         | [`roleallow`](cil_role_statements.md#roleallow)        | [`roleattribute`](cil_role_statements.md#roleattribute)    |
    201 | [`roletransition`](cil_role_statements.md#roletransition)    | [`type`](cil_type_statements.md#type)         | [`typealias`](cil_type_statements.md#typealias)        | [`typeattribute`](cil_type_statements.md#typeattribute)    |
    202 | [`typechange`](cil_type_statements.md#typechange)        | [`typemember`](cil_type_statements.md#typemember)   | [`typetransition`](cil_type_statements.md#typetransition)   |                    |
    203 
    204 **Statement definition:**
    205 
    206     (optional optional_id
    207         cil_statement
    208         ...
    209     )
    210 
    211 **Where:**
    212 
    213 <table>
    214 <colgroup>
    215 <col width="25%" />
    216 <col width="75%" />
    217 </colgroup>
    218 <tbody>
    219 <tr class="odd">
    220 <td align="left"><p><code>optional</code></p></td>
    221 <td align="left"><p>The <code>optional</code> keyword.</p></td>
    222 </tr>
    223 <tr class="even">
    224 <td align="left"><p><code>optional_id</code></p></td>
    225 <td align="left"><p>The <code>optional</code> namespace identifier.</p></td>
    226 </tr>
    227 <tr class="odd">
    228 <td align="left"><p><code>cil_statement</code></p></td>
    229 <td align="left"><p>Zero or more valid CIL statements.</p></td>
    230 </tr>
    231 </tbody>
    232 </table>
    233 
    234 **Example:**
    235 
    236 This example will instantiate the optional block `ext_gateway.move_file` into policy providing all optional CIL statements can be resolved:
    237 
    238     (block ext_gateway
    239         ......
    240         (optional move_file
    241             (typetransition process msg_filter.move_file.in_queue file msg_filter.move_file.in_file)
    242             (allow process msg_filter.move_file.in_queue (dir (read getattr write search add_name)))
    243             (allow process msg_filter.move_file.in_file (file (write create getattr)))
    244             (allow msg_filter.move_file.in_file unconfined.object (filesystem (associate)))
    245             (typetransition msg_filter.int_gateway.process msg_filter.move_file.out_queue file
    246                 msg_filter.move_file.out_file)
    247             (allow msg_filter.int_gateway.process msg_filter.move_file.out_queue (dir (read write search)))
    248             (allow msg_filter.int_gateway.process msg_filter.move_file.out_file (file (read getattr unlink)))
    249         ) ; End optional block
    250 
    251         .....
    252     ) ; End block
    253 
    254 in
    255 --
    256 
    257 Allows the insertion of CIL statements into a named container ([`block`](cil_container_statements.md#block), [`optional`](cil_container_statements.md#optional) or [`macro`](cil_call_macro_statements.md#macro)). This statement is not allowed in [`booleanif`](cil_conditional_statements.md#booleanif) or [`tunableif`](cil_conditional_statements.md#tunableif) statements.
    258 
    259 **Statement definition:**
    260 
    261     (in container_id
    262         cil_statement
    263         ...
    264     )
    265 
    266 **Where:**
    267 
    268 <table>
    269 <colgroup>
    270 <col width="25%" />
    271 <col width="75%" />
    272 </colgroup>
    273 <tbody>
    274 <tr class="odd">
    275 <td align="left"><p><code>in</code></p></td>
    276 <td align="left"><p>The <code>in</code> keyword.</p></td>
    277 </tr>
    278 <tr class="even">
    279 <td align="left"><p><code>container_id</code></p></td>
    280 <td align="left"><p>A valid <code>block</code>, <code>optional</code> or <code>macro</code> namespace identifier.</p></td>
    281 </tr>
    282 <tr class="odd">
    283 <td align="left"><p><code>cil_statement</code></p></td>
    284 <td align="left"><p>Zero or more valid CIL statements.</p></td>
    285 </tr>
    286 </tbody>
    287 </table>
    288 
    289 **Example:**
    290 
    291 This will add rules to the container named `system_server`:
    292 
    293     (in system_server
    294         (dontaudit process secmark_demo.dns_packet (packet (send recv)))
    295         (allow process secmark_demo.dns_packet (packet (send recv)))
    296     )
    297