..  Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

..    http://www.apache.org/licenses/LICENSE-2.0

..  Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

.. _dev-security:

Security Guide
==============

Reporting Security Issues
-------------------------

The Apache Software Foundation takes a very active stance in eliminating security problems and denial of service attacks against its products.
We strongly encourage folks to report such problems to our private security mailing list first, before disclosing them in a public forum.

Please note that the security mailing list should only be used for reporting undisclosed security vulnerabilities and managing the process of fixing such vulnerabilities. We cannot accept regular bug reports or other queries at this address. All mail sent to this address that does not relate to an undisclosed security problem in our source code will be ignored.
Questions about: if a vulnerability applies to your particular application obtaining further information on a published vulnerability availability of patches
and/or new releases should be addressed to the user Discuss forum.

The private security mailing address is: `security@apache.org <security@apache.org>`_.
Feel free to consult the `Apache Security guide <https://www.apache.org/security/>`_.


Considerations
--------------
The default binary generated by TVM only relies on a minimum runtime API.
The runtime depends on a limited set of system calls(e.g. malloc) in the system library.

AutoTVM data exchange between the tracker, server and client are in plain-text.
It is recommended to use them under trusted networking environment or encrypted channels.
