diff --git a/Ghidra/RuntimeScripts/Common/server/svrREADME.html b/Ghidra/RuntimeScripts/Common/server/svrREADME.html
deleted file mode 100644
index c52b2a72ed..0000000000
--- a/Ghidra/RuntimeScripts/Common/server/svrREADME.html
+++ /dev/null
@@ -1,1119 +0,0 @@
-
-
-
-
-
-
-
-Ghidra Server README
-
-
-
-Ghidra Server README
-
-Table of Contents
-
-
-
-
-
-
-
-The Ghidra Server is incorporated into the standard Ghidra software distribution. Simply unpack the
-Ghidra distribution, configure the Ghidra Server and perform the OS-specific install and you should
-have the server running in no time.
-
-
-
-The Ghidra Server utilizes the YAJSW Java service wrapper to launch the application and provides OS
-specific scripts which enable the application to run as a service.
-
-
-
-NOTE: It is very important that only a single server instance is running against any given
-server repositories directory. This can be assured if only the default port is ever used.
-The daemon/service mechanism assumes that only one instance of the service exists. Attempting to
-run a second concurrent instance may lead to difficulties and is not supported.
-
-
-
-NOTE: It is highly recommended that the installation files for Ghidra reside on a local drive
-and that the intended Ghidra Server process owner is granted full access to the Ghidra installation
-directory (this is frequently not the case for NFS/SMB mounted home directories).
-
-
-
-You may also refer to the InstallationGuide.html file within the
-docs subdirectory for general installation information.
-
-
-(Back to Top)
-
-
-
-The installation of a suitable Java Runtime Environment must be completed before installing or
-running the Ghidra Server. Please refer to the Ghidra Installation Guide to identify
-a suitable version. Since the Ghidra Server is unable to interactively identify a Java installation
-at runtime it must rely upon the setting of JAVA_HOME, execution search PATH or the use of standard
-Java installation locations. It is important to consider the service execution environment which may
-differ from the administrator who may be installing the service. For this reason use of an installed
-Java release may be preferable over one that is simply unpacked to an arbitrary location.
-
-
-(Back to Top)
-
-
-
-Before installing and running the Ghidra Server, the server/server.conf
-file must be modified to suit your particular needs. Within this file, locate the lines labeled:
-
- wrapper.app.parameter.#
-
-These lines correspond to a sequential list of server command line arguments - be sure not duplicate
-a parameter number. The comments within this file indicate the available command line arguments
-which should be specified here based upon the desired user authentication, repositories directory
-location and other associated options.
-
-
-
-It is highly recommended that you specify a repositories directory outside of your
-Ghidra installation directory with an absolute path so that it may be re-used more easily with
-future upgraded installations of Ghidra. Due to the use of a filesystem
-watcher service the use of a locally attached storage device is preferred and will also ensure
-the best performance.
-
-
-
-NOTE: The server may fail to start if the repository native filesystem does
-not support the use of a filesystem watcher service. This could occur if attempting to use a
-remotely-mounted filesystem which may lack the required event support. The watcher service is used
-in conjunction with command processing associated with the svrAdmin command. If a running
-server fails to process queued svrAdmin command requests, the repository native filesystem
-may be the cause.
-
-
-
-When upgrading your Ghidra installation, you will need to copy your app parameters from your old
-server.conf to the new server.conf. Do not copy
-the entire server.conf file as this may prevent the server from running
-properly. If running as a service, you must run the server/svrUninstall script
-from the old installation before running the server/svrInstall script from the
-new installation. Using a non-default repositories directory outside your Ghidra installation
-will simplify the migration process.
-
-
-(Back to Top)
-
-
-
-The Ghidra Server produces two log files, which for the most part have the same content.
-The service wrapper.log file generally resides within the Ghidra installation root
-directory, while the server.log file resides within the configured repositories
-directory. When running the server in console mode all wrapper.log output is directed
-to the console.
-
-(Back to Top)
-
-
-
-
-The Ghidra Server currently maintains an in-memory state for all repositories. We are aware that
-this can limit the scalability of the Ghidra Server. The maximum memory used by the process can be
-set within the server/server.conf file by adjusting the following setting:
-
- wrapper.java.maxmemory
-
-
-
-
-WARNING! There are currently no safeguards when insufficient memory is available to the Ghidra
-Server and can cause severe failure if an out of memory error occurs.
-
-
-
-The following formula can be used to approximate an appropriate setting for this
-maxmemory value where FileCount
-represents the maximum number of repository files and ClientCount
-is the number of active Ghidra clients connected at one time.
-
- wrapper.java.maxmemory = 16 + (32 * FileCount/10000) + (2 * ClientCount)
-
-Example:
-
- 100,000 files and 25 connected Ghidra clients
- 16 + (32 * 100000/10000) + (2 * 25) = 386
- wrapper.java.maxmemory=772 (2 * 386, see NOTE below)
-
-
-
-NOTE: Due to the dynamic memory demands on the server not considered by this calculation (e.g., open file handles, etc.),
-the actual maxmemory setting used should be larger
-than the calculated value. At a minimum, it is recommended that the calculated value be doubled, and a larger value
-may be appropriate based upon server loading.
-
-The Java VisualVM tool (if available for your host) may also be used to examine memory usage while
-the server is running. This tool is NOT provided with any Ghidra distribution.
-
-
-(Back to Top)
-
-
-
-
-Both Ghidra Server and client application make extensive use of forward and reverse network name
-lookups. If this service is not properly configured on your network and hosts, names may fail to
-be resolved or in certain cases cause severe performance delays due to improperly serviced DNS
-name/address queries.
-
-
-
-By default the server will attempt to identify an appropriate remote access IPv4 address which will
-be written to the log at startup. In addition, the server will listen for incoming
-connections on all IPv4 interfaces by default. It is important to understand the difference between
-the published remote access address and the listening address (i.e. interface) which are both
-configurable. See the -ip and -i options in
-the Server Options section for more details.
-
-
-(Back to Top)
-
-
-
-
-The Ghidra Server has been designed to support many possible user authentication modes:
-
-
- - No authentication - any user which has been added to the server may connect without
- password or credentials.
-
- - Local Ghidra password (-a0) - passwords associated with
- each user added to the server are maintained in the users file located
- within the repositories directory. The user will be prompted for this password when connecting
- to the server. The default password changeme is used when a user is
- first added or when the user is reset (see Server
- Administration). This default password must be changed by the user to avoid its expiration.
-
- - Active Directory via Kerberos (-a1) - user authentication is
- performed against your local Active Directory system using Kerberos to do so. The -d<ad_domain>
- argument is required to specify the domain name of your Active Directory system.
-
- It is also possible to authenticate against your Active Directory system using LDAP. See the
- LDAP example when using JAAS -a4 mode.
-
-
- - PKI authentication (-a2) - user authentication is performed
- using PKI user certificates. When using this mode, the distinguished name (DN) for each user
- must be associated with each server User ID (see Server
- Administration). In addition, each user must configure Ghidra with the location of their
- signing key/certificate keystore file (see PKI Certificates
- for more information).
-
- Please note that each user's certificate must be issued by a trusted certificate authority
- which has been properly added to the Ghidra Server's cacerts file. See
- Managing PKI Certificate Authorities for more information.
-
- In an attempt to simplify the determination of user DN's, a log file
- (UnknownDN.log) records user DNs which are unknown. After adding a
- user to the server, ask the user to attempt a login using their PKCS certificate. This should
- result in their DN being recorded to this log file. The server administrator may now copy the
- appropriate DN from this log file when assigning the DN for a user.
-
-
- - JAAS - Java Authentication and Authorization Service (-a4) -
- user authentication is delegated to the JAAS subsystem. The -jaas <config_file> argument
- is required to specify the JAAS config file. The JAAS config file supplied (server/jaas.conf)
- contains various example configurations which may be used to establish an 'auth' configuration
- section. None of the example configurations use the 'auth' name so they will be ignored by default.
-
- JAAS is architected similar to Linux/Unix PAM, where a named authentication configuration is possibly
- composed of several different modules. Ghidra's support of JAAS only handles single simple
- JAAS modules that requests the name and password from the user.
-
- Some known JAAS login modules:
-
- - com.sun.security.auth.module.LdapLoginModule - allows authentication to an LDAP server. There
- is an example of using this module to authenticate against an Active Directory system in the
- jaas.conf file.
-
- - net.sf.jpam.jaas.JpamLoginModule - (Linux/Unix server only) allows authentication against
- the local PAM configuration. You will need to download JPAM from SourceForce and install the
- libraries in the necessary locations. See the example in the jaas.conf file.
-
- - ghidra.server.security.loginmodule.ExternalProgramLoginModule - spawns an external
- program for each authentication request, and uses the external program's exit code as the indicator
- of successful authentication.
-
- There is an example (and non-useful) implementation of an external authenticator provided with
- the Ghidra instalation called server/jaas_external_program.example.sh.
-
- This login module strives to be compatible with Apache's mod_authnz_external API, and you should
- be able to use any mod_authnz_external authenticator with Ghidra.
-
- The external program is fed the username\n and password\n on its STDIN (ie. two text lines).
- The external authenticator needs to exit with 0 (zero) error level
- if the authentication was successful, or a non-zero error level if not successful.
-
- - com.sun.security.auth.module.Krb5LoginModule - not recommended - this login module
- is used in the -a1 Active Directory via Kerberos authentication mode, and as such you should use it that way.
-
-
-
-
-
- - Use of an SSH pre-shared key (-ssh) is supported as an
- alternate form of authentication when using Local Ghidra password (-a0).
- This SSH authentication is currently supported by the Headless Analyzer only. See
- SSH User Authentication for configuration details.
-
-
-
-(Back to Top)
-
-
-
-
-When the -ssh option has been included in conjunction with password based
-authentications mode (-a0 a user's SSH public key may be added to the server to facilitate
-access by a Headless Analyzer. An SSH public key file must be added to the server repository for
-each user who requires headless SSH authentication. The SSH public key file (e.g.,
-id_rsa.pub) must be copied to the repositories/~ssh
-subdirectory to a file named <username>.pub. Removing the file will
-eliminate SSH based authentication for the corresponding user. When creating the
-~ssh subdirectory, it should be owned by the Ghidra Server process
-owner with full access and any SSH public keys readable by the process owner. Changes to the SSH
-public key files may be made without restarting the Ghidra Server.
-
-Each user may generate a suitable SSH key pair with the ssh-keygen command issued from a
-shell prompt. A PEM formatted RSA key-pair should be generated using the following command options:
-
-
- ssh-keygen -m pem -t rsa -b 2048
-
-NOTE: Ghidra Server authentication does not currently support the OPENSSH key format which may be the default
-ssh-keygen format (-m option) on some systems such as Ubuntu.
-In addition, other key types (-t option) such as ecdsa and ed25519
-are not currently supported.
-
-
-(Back to Top)
-
-
-
-
- - Networking options
-
- - -ip <hostname>
Identifies the remote access hostname (FQDN)
- or IPv4 address which should be used by remote clients to access the server. By default the
- host name reported by the operating system is resolved to an IPv4 address, if this fails the
- local loopback address is used. The server log will indicate the remote access hostname
- at startup. This option may be required when a server has multiple IP interfaces, relies on
- a dynamic DNS or other network address translation for incoming connections.
- This option establishes the property value for java.rmi.server.hostname.
-
-
- - -i <#.#.#.#>
Forces the server to be bound to a specific
- IPv4 interface on the server. If specified and the -ip option is not,
- the address specified by -i will establish the remote access IP
- address as well as restrict the listening interface. If this option is not specified connections
- will be accepted on any interface.
-
- - -p#
Allows the base TCP port to be specified (default: 13100). The
- server utilizes three (3) TCP ports starting with the specified base port (e.g., 13100,13101 and 13102).
- The ports utilized are logged by the server during startup.
-
- - -n
Enables reverse name lookup for IP addresses when logging
- (requires proper configuration of reverse lookup by your DNS server). Please note that logging
- of host names is now disabled by default due to the slow-down which occurs when reverse DNS is
- not properly configured on the network.
-
-
-
- - Authentication options
-
-
-
-
-(Back to Top)
-
-
-
-Server Scripts (located within the server subdirectory)
-
- - svrInstall.bat
installs server as service (ghidraSvr)
-
- - svrUninstall.bat
removes previously installed server service
-
- - svrAdmin.bat
facilitates Ghidra Server administrative commands
- (see Server Administration)
-
- - ghidraSvr.bat
provides a variety of commands for controlling
- the server when running as a daemon process. When running this script it accepts a single
- argument which is one of the following commands. Many of these commands are included so that
- this script may be used for controlling the service.
-
- - console
starts server within the current terminal window.
- console argument may be omitted to allow for double-click execution
- in this mode.
-
- - start
starts the previously installed Ghidra Server service
-
- - stop
stops the installed Ghidra Server service which is
- currently running
-
- - restart
stops and restarts the previously installed Ghidra
- Server service
-
- - status
displays the current status of the Ghidra Server
- (ghidraSvr) service
-
-
- NOTE: The above scripts may be run from a CMD window, or by
- double-clicking the script file from an Explorer window. Other than the console and status
- operation, elevated privilege is needed to run these commands. As such the user executing
- these scripts must be a member of the Administrator group and must be run with elevated privilege.
- If using Windows Vista or newer, the best way to accomplish this is to run the
- CMD shell using the Run as Administrator
- action which is available by right-clicking on a command shortcut or batch file. If the
- CMD shell is run in this manner, the Ghidra Server scripts may then be
- executed within the shell to run with administrator privilege.
-
-
-
-Running Server in Console Window (intended for diagnostic use only)
-
- NOTE: Starting the server in console mode is generally intended for diagnostic use only.
- Extreme care must be taken to ensure that any user who starts the Ghidra Server via this script
- has full access to all directories and files within the root repository directory.
-
- If the Ghidra Server is not already running, it may be started within a console window by
- running the ghidraSvr.bat console command. When you wish to terminate the
- server, use the Ctrl-C key sequence within the server console window and
- wait for a clean shutdown.
-
-
-
-Install as Automatic Service (must have Administrator privilege)
-
- The Ghidra Server may be installed as an automatic service by executing the
- svrInstall.bat script. This script may be run from a
- CMD window, or by double-clicking the script file from an Explorer
- window. Once installed, the server will start automatically when the system is booted.
- Immediately after running this script the service will not be running, you will need to either
- reboot or start the service from the Service Control Panel.
-
-
-
-Uninstall Service (must have Administrator privilege)
-
- If after installing the Ghidra Server as a service you wish to uninstall it, you may run the
- svrUninstall.bat script. You must stop the service via the Service
- Control Panel prior to running this script. This script may be run from a CMD
- window, or by double-clicking the script file from an Explorer window.
-
-
- NOTE: It is very important that you uninstall the service prior to doing any of the
- following activities:
-
- - deleting or upgrading the Ghidra installation
- - moving/renaming the Ghidra installation directory
-
-
-
-(Back to Top)
-
-
-
-NOTE: macOS has limited support (see macOS - Service fails to start).
-
-Server Scripts (located within the server subdirectory)
-
-
- - svrInstall
installs server as service (ghidraSvr
- or wrapper.ghidraSvr)
-
- - svrUninstall
removes previously installed server service
-
- - svrAdmin
facilitates administrative commands (see
- Server Administration)
-
- - ghidraSvr
provides a variety of commands for controlling the
- server when running as a daemon process. When running this script it accepts a single argument
- which is one of the following commands. Many of these commands are included so that this script
- may be used for controlling the service.
-
- - console
starts server within the current terminal window
-
- - start
starts the previously installed Ghidra Server service
-
- - stop
stops the installed Ghidra Server service which is
- currently running
-
- - restart
stops and restarts the previously installed Ghidra
- Server service
-
- - status
displays the current status of the Ghidra Server
- (ghidraSvr) service
-
-
-
-Running Server in Console Window
-
- NOTE: Starting the server in console mode is generally intended for diagnostic use
- only. Care must be taken to ensure that any user who starts the Ghidra Server via this script
- has full access to all directories and files within the root repository directory.
-
-
- If the Ghidra Server is not already running, it may be started within a terminal window by
- running the command: ghidraSvr console. When you wish to terminate
- the server, use the Ctrl-C key sequence within the server console window and
- wait for a clean shutdown.
-
-
-
-Install as Automatic Service (must have admin privilege)
-
- The Ghidra Server may be installed as an automatic service by executing the
- svrInstall script. Once installed, the server will start automatically
- when the system is booted. If performing an upgrade to an existing Ghidra Server installation
- you must uninstall the existing Ghidra Server first (see
- Uninstall Service).
-
-
- In order for the installed service script to survive Java system updates, which may change
- the installed Java version, it is highly recommended that the GHIDRA_JAVA_HOME variable be set
- properly at the top of the ghidraSvr script prior to the server install.
- GHIDRA_JAVA_HOME should refer to a non-changing path where Java is installed. For a system-installed
- Java the major-version symblic-link path should be specified in favor of a
- full-version path which stipulates minor-version information. In addition, it is important
- that the Ghidra Server service be restarted anytime the installed Java version is updated where
- this symbolic link has been modified to reference a newly installed Java version. Failure to
- use this approach may result in the Ghidra Server service script referring to an invalid Java
- path following an update.
-
-Example setting of GHIDRA_JAVA_HOME within ghidraSvr script:
-
- GHIDRA_JAVA_HOME=/usr/lib/jvm/java-21-openjdk
-
-
- If it is preferred to run the service with a dedicated local user account, the following
- entry may be added to the server.conf file with the appropriate account specified in
- place of <uid>.
- A dedicated local service account should generally be a no-login account with a
- corresponding group identifier with the same name (i.e., see /etc/passwd and /etc/group).
- The local account should be established and specified with server.conf prior to
- installation of the Ghidra Server service.
-
-
- wrapper.app.account=<uid>
-
-
-It is also important that the repositories directory and Ghidra installation files
-be owned by the service account with proper permissions. Note that while the Ghidra Server
-Java process will run using the specified uid the wrapper process will continue
-to run as root and monitor/manage the Java process.
-
-
-Uninstall Service (must have admin privilege)
-
- If after installing the Ghidra Server as a service you wish to uninstall it, you may run the
- svrUninstall script.
-
-
- IMPORTANT: It is very important that you uninstall the Ghidra Server service using the
- original Ghidra software installation. Use of a newer Ghidra software install may not properly
- uninstall a different service version. This is particularly true if uninstalling
- a Ghidra Server version prior to 11.2. Such an uninstall will be required when:
-
- - deleting or upgrading the Ghidra installation
- - moving/renaming the Ghidra installation directory
-
-
-
- NOTE: The service control mechanism for Linux changed with the Ghidra 11.2 release.
- The init.d mechanism was previously used in all cases, whereas the
- systemd service mechanism may now used based upon YAJSW preference.
-
-
-(Back to Top)
-
-
-
-
- The script svrAdmin, or svrAdmin.bat, provides
- the ability to manage Ghidra Server users and repositories. This script must be run from a
- command shell so that the proper command line arguments may be specified. This command
- should only be used after the corresponding Ghidra installation has been properly
- configured via modification of the server/server.conf file
- (see Server Configuration) and installed and/or started.
-
- Many of the commands are queued for subsequent execution by the Ghidra Server process.
- Due to this queing, there may be a delay between the invocation of a svrAdmin
- command and its desired affect. The Ghidra log file(s) may be examined for feedback on
- queued command execution (see Server Logs).
-
-
-
- The general command usage is:
-
-
- svrAdmin [<server-root-path>]
- [-add <user_sid> [--p]]
- [-grant <user_sid> <"+r"|"+w"|"+a"> <repository_name>]
- [-revoke <user_sid> <repository_name>]
- [-remove <user_sid>]
- [-reset <user_sid> [--p]]
- [-dn <user_sid> "<user_dn>"]
- [-list <user_sid> [<user_sid>...]]
- [-list [--users]]
- [-users]
- [-migrate-all]
- [-migrate "<repository_name>"]
-
-
-
-
- - <server-root-path>
- There is normally no need to specify this argument on the command line.
- The default server-root-path is determined by
- the server.conf setting of the 'ghidra.repositories.dir' variable. This allows both the server
- execution and svrAdmin script to utilize the same setting.
-
- - -add (Adding a User)
- All authentication modes require that a user first be added to the server for a connection to
- be permitted. If Ghidra password authentication is used [-a0], the
- initial password is set to changeme. This password must be changed by
- the user within 24-hours to avoid its expiration (password expiration period can be extended as
- a server option, see -e server option).
- Alternatively, the initial password may be specified by including the optional --p
- parameter which will prompt for an initial password.
-
- Examples:
-
- svrAdmin -add mySID
- svrAdmin -add mySID --p
-
-
- - -grant (Grant Repository Access for User)
- Grant access for a specified user and repository where both must be known to the server.
- Repository access permission must be specified as +r for READ_ONLY, +w for WRITE or +a for ADMIN.
- Examples:
-
- svrAdmin -grant mySID +a myRepo
- svrAdmin -grant mySID +w myRepo
-
-
- - -revoke (Revoke Repository Access for User)
- Revoke the access for a specified user and named repository. Currently, revoking access for a
- user does not disconnect them if currently connected.
- Examples:
-
- svrAdmin -revoke mySID myRepo
-
-
- - -remove (Removing a User)
- A user may be removed from the Ghidra Server and all repositories with this command form. This will only prevent the
- specified user from connecting to the server in the future and will have no effect on the state or history
- of repository files. If a repository admin wishes to clear a user's checkouts, this is
- a separate task which may be performed from an admin's Ghidra client. Currently, removing a
- user does not disconnect them if currently connected.
-
- Example:
-
- svrAdmin -remove mySID
-
-
- - -reset (Reset User's Ghidra Password)
- If a user's password has expired, or has simply been forgotten, the password may be reset
- to changeme. After resetting, this password must be changed by the user within
- 24-hours to avoid its expiration (password expiration period can be extended as a server option).
- Alternatively, the new password may be specified by including the optional --p
- parameter which will prompt for an initial password.
-
- Example:
-
- svrAdmin -reset mySID
- svrAdmin -reset mySID --p
-
-
- - -dn (Assign User's Distinguished Name)
- The use of PKI authentication requires that each user's DN be associated with their user SID.
-
- Example:
-
- svrAdmin -dn mySID "CN=MyName,OU=AGENCY,OU=DoD,O=U.S. Government,C=US"
-
- NOTE: After having been added to the server, a user's DN may be copied from the
- UnknownDN.log file following an attempted connection with their PKCS
- certificate.
-
- - -list (List All Repositories and/or User Permissions)
- If the --users option is also present, the complete user access
- list will be included for each repository. Otherwise, command may be followed by one or user SIDs (separated by a space)
- which will limit the displayed repository list and access permissions to those users specified.
-
- Example:
-
- svrAdmin -list
- svrAdmin -list --users
- svrAdmin -list mySID
-
- - -users (List All Users)
- Lists all users with server access.
-
- Example:
-
- svrAdmin -users
-
-
- - -migrate-all (Migrate All Repositories to Use Indexed
- File-System Storage)
- For all repositories which are using the deprecated Mangled Filesystem storage, they will be
- marked for migration to the Indexed Filesystem storage with support for longer file pathnames.
- The actual migration will be performed when the Ghidra Server is restarted.
-
- Please note that any migration to the Indexed filesystem storage is a one-way conversion so a
- backup of your server repositories directory is highly recommended before proceeding.
-
- Example:
-
- svrAdmin -migrate-all
-
-
- - -migrate (Migrate a Specified Repository to use
- Indexed File-System Storage)
- The specified repository will be marked for migration to the Indexed Filesystem storage with
- support for longer file pathnames. The actual migration will be performed when the Ghidra
- Server is restarted.
-
- Please note that any migration to the Indexed filesystem storage is a one-way conversion so a
- backup of your server repositories directory is highly recommended before proceeding.
-
- Example:
-
- svrAdmin -migrate "myProject"
-
-
-
-
-(Back to Top)
-
-
-
-
-As with any server, it is highly recommended that your server repositories directory be periodically
-backed-up or whenever an upgrade (or data migration) is performed. While backups may be taken while
-the Ghidra Server is idle (e.g., after midnight), it is always safest to stop the Ghidra Server
-while a backup is in progress.
-
-
-(Back to Top)
-
-
-
-
-Any user who has Admin privilege of a specific repository may use the Ghidra client to View
-Checkouts for a specific file and Delete individual checkouts from those that are listed. The
-View Checkouts action is available from the popup-menu of the Ghidra
-Project Window by right-clicking on a specific project file.
-
-
-
-Under special circumstances (e.g., classroom environment) it may be desirable to remove all
-checkouts either for a specific repository or an entire Ghidra Server. Under Linux/Mac this is
-most easily accomplished from the command shell while the Ghidra Server is stopped. The following
-command may be used:
-
-
- find <repo-path> -name checkout.dat -exec rm {} \;
-
-
-where <repo-path> is the directory path of a specific named
-repository root, or the parent repositories directory if clearing checkouts for all repositories.
-
-WARNING! Since the find command is recursive, care must be taken when
-specifying the <repo-path> and the other parameters. If you specify
-the incorrect <repo-path> or omit the correct
--name argument, you may remove important files without the ability to recover.
-
-
-(Back to Top)
-
-
-
-
- PKI keys/certificates can be used to authenticate clients and/or servers.
- When using the Ghidra Server PKI authentication mode this corresponds to "client authentication"
- which requires the server.conf to specify a cacerts
- file location and each user client to
- configure a user signing key/certificate keystore file. If clients wish to authenticate the server,
- the server.conf must specify a server key/certificate keystore
- file and each user client must configure
- a cacerts file. See
- Managing PKI Certificate Authorities
- for more information on configuring a cacerts file.
-
-
-
- User and server certificates must be acquired through one of many trusted authorities
- identified by the cacerts file installed by the peer system. Your network support
- staff should be able to help you acquire a suitable signing key/certificate in the form
- of either a *.p12, *.pks, or *.pfx file.
-
-
-
- User's of the Ghidra GUI application can install their key/certificate file via the
- project window menu item Edit->Set PKI Certificate.... The user will be prompted
- for their keystore password the first time key access is required for a network connection
- after starting the application.
- If using the analyzeHeadless script, see the
- analyzeHeadlessREADME.html file for details.
-
-
-
- If the Ghidra Server will be installing a server certificate, the server.conf
- file should be modified to properly identify the server's key/certificate location (ghidra.keystore)
- and password (ghidra.password).
-
-
-(Back to Top)
-
-
-
-
-When utilizing PKI authentication for a Ghidra Server a set of certificates for trusted Certificate
-Authorities (CA) must be collected and added to a cacerts keystore file created using the Java
-keytool. The Java keytool can be found within the Java Development Kit (JDK) provided with
-Ghidra (java/bin/keytool) or any other Java distribution. The default
-cacerts keystore file location is Ghidra/cacerts
-and is also specified by the ghidra.cacerts property setting within the
-server.conf file. Uncomment this specification within the
-server.conf file to activate use of the cacerts
-for all incoming SSL/TLS connections (i.e., all Ghidra client users must install and employ the
-use of their personal PKI signing certificate for both headed and headless use - see
-PKI Certificates). Clients can also impose server authentication
-for all HTTPS and Ghidra Server connections by creating the cacerts file
-and enabling the ghidra.cacerts
-property setting within the support/launch.sh and/or launch.bat scripts.
-
-
-
-
-Individual CA public key certificates should be obtained in a Base64 encoding (see sample below).
-If pasting the encoded certificate into a file, be sure to include an extra blank line after the
-END CERTIFICATE line.
-
-
-
-Sample Base64 encoded certificate:
-
-
------BEGIN CERTIFICATE-----
-laSKCIElkjsudCUDusjSUkjeMSUjAJHDuLQWMCMausALkKXMXOOjSKSUjssjSKAA
-ksDSDjLKJHAuemCXXUmxxqjaskuDSYRmxiqgDlakkUSUdhemjASKUakjhuEhxMSD
-...
-ksJKDwocQwyeEIcbzHtyrSLfoeyGCmvbNLGHpgoruSTYQafzDFTgwjkJHCXVDjdg
-KDowiyYTXkcuiwCJXuyqCHpdoORriwwcCWUskucuwHDJskuejdkUWJCUDSjujsUE
------END CERTIFICATE-----
-
-
-
-
-
-You can inspect the contents of a Base64 encoded certificate file with the following command:
-
-
- keytool -printcert -v -file <base64file>
-
-
-where:
-
- - <base64file> is the file containing the Base64 encoded CA certificate to be imported.
-
-
-The Owner common name (CN) displayed by this command should be used as the alias when importing the
-certificate into your cacerts file.
-
-The following command should be used to add a CA certificate to a new or existing cacerts file:
-
-
- keytool -import -alias "<caAlias>" -file <base64file> -storetype jks -keystore <cacerts-file>
-
-
-where:
-
- - <caAlias> is the name of the CA corresponding to the
- imported certificate.
- - <base64file> is the file containing the Base64 encoded CA
- certificate to be imported.
- - <cacerts-file> is the cacerts file to be used by the Ghidra
- Server (and/or client if needed).
-
-
-The keystore password will be requested and is used to restrict future modifications to the
-cacerts file.
-
-When starting the Ghidra Server with PKI authentication enabled, the CA certificates contained
-within the cacerts file will be dumped to the log with their expiration dates.
-
-
-
-Please note that the Ghidra Server does not currently support Certificate Revocation Lists (CRLs).
-
-
-(Back to Top)
-
-
-
-
-
- - Be sure to backup your projects and tools to ensure that the new Ghidra installation does
- not overwrite any of your data. Individual program files upgraded to a newer version of Ghidra
- can not be opened with an older version.
-
- - Uninstall an installed Ghidra Server Service by following the Uninstall Service
- instructions corresponding to your operating system (Windows
- or Linux/macOS).
-
- - Unzip the new Ghidra distribution to a new installation directory (general unpacking and installation
- guidelines may be found in ghidra_x.x/docs/InstallationGuide.html).
-
- - Copy the old repositories directory to the new Ghidra Server
- installation directory.
-
- - Copy the wrapper.app.parameter.# lines from your old
- server/server.conf file to the new installation
- server/server.conf. For 5.0 release and earlier, your old
- server.conf file is located within a platform-specific directory
- (core/os/<platform>). No other changes should be made to your new
- server.conf file.
-
- Do not replace the new server.conf file with your old
- server.conf file, as this could cause server problems.
-
-
- - If desired, install the Ghidra Server Service from the new installation server
- subdirectory by following the instructions corresponding to your operating system
- (Windows or Linux/macOS).
-
-
-
-WARNING! As of Ghidra 7.0 a new project/server storage implementation,
-Indexed-V1, has been added which is not compatible with older versions of
-Ghidra. The Indexed-V0 filesystem storage allows longer filenames and
-paths to exist within a project, while the V1 version expands support to
-facilitate some of the very large project/repository features introduced in Ghidra 7.0. Since the
-legacy storage implementation (Mangled) used by older projects and repositories
-is still supported, conflicting storage behavior may exist between a Ghidra project and its server
-repository for long filename/path support. It is highly recommended that all server repositories and
-associated projects be migrated to the new Indexed storage implementation in a coordinated fashion
-after making a complete backup. All new Ghidra projects will utilize the new Indexed storage
-implementation, so care should taken when creating shared projects with older repositories.
-
-
-
-
-NOTE: If using Ghidra 6.0.x, opening a project which uses the newer Indexed-V1
-filesystem may cause the project storage to revert to the older Indexed-V0 filesystem.
-
-
-
-A user may determine which storage implementation is used by a project by viewing the
-Project Info display (via Project ->
-View Project Info...). Local projects using the legacy Mangled
-filesystem may be migrated to the new Indexed filesystem via this
-Project Info panel. The status of Ghidra Server repositories storage can be
-determined and flagged for migration via the server/svrAdmin script (described
-in the Server Administration section). Please note that any
-migration to the Indexed filesystem storage is a one-way conversion so a
-backup of your project or server repositories directory is highly recommended before proceeding.
-
-
-
-(Back to Top)
-
-
-
-Failures Creating Repository Folders / Checking in Files
-
-If you see continuous failures to create repository folders or failures to check in files, check
-the disk space on the server or folder permissions. When the server runs out of disk space, it
-cannot create folders or check in files.
-
-
-
-Client/Server connection errors
-
-The Ghidra Server has transitioned to using SSL/TLS connections when accessing the server's RMI
-registry. This change in communication protocol can cause unexpected symptoms when attempting to
-connect incompatible versions of Ghidra. When an older incompatible Ghidra client attempts to access a
-newer SSL/TLS enabled Ghidra Server registry, the following connection error will occur:
-
- non-JRMP server at remote endpoint
-
-
-
-
-MS Windows - ERROR Incorrect function (WindowsWatchService)
-
-The Ghidra Server employs a file system watcher service for the repositories directory which must
-reside within a locally mounted NTFS or ReFS filesystem.
-
-
-
-MS Windows - ERROR Missing Temp Directory
-
-Running the Ghidra Server as an installed service under Windows may attempt to use a non-existing
-temporary directory (e.g., C:\Windows\system32\config\systemprofile\AppData\Local\Temp\).
-The work-around for this is to configure the server to use an existing temporary directory
-(e.g., C:\Windows\Temp). This can be done by editing the
-server.conf file, locate the wrapper.java.additional
-entries and add/uncomment an entry with your temporary directory specified. For example:
-
- wrapper.java.additional.3=-Djava.io.tmpdir=C:\Windows\Temp
-
-Be sure to use the next unique sequence number for your wrapper.java.additional entry.
-
-
-
-MS Windows 7 and 8 - ghidraSvr.bat,
- svrInstall.bat, or svrUninstall.bat Error
-
-The following error may occur when attempting to install/uninstall/start/stop/restart the Ghidra
-Server under MS Windows 7 or 8 even if the user is a member of the Administrator group:
-
- Access denied: please check the user credentials
-
-The user executing these scripts must be a member of the Administrator group and must be run with
-elevated privilege. The best way to accomplish this is to run the CMD
-shell using the Run as Administrator action which is available by
-right-clicking on a command shortcut or batch file. If the CMD shell is
-run in this manner, the Ghidra Server scripts may then be executed within the shell to run with
-administrator privilege. Failure to run the scripts in this manner may cause failure information
-to be hidden from view due to the privilege escalation mechanism.
-
-
-
-Linux - SELinux must be disabled
-
-The Ghidra Server may not start properly if SELinux has not been disabled. This setting is
-specified in the file /etc/selinux/config.
-
-
-
-Linux - Potential hang from /dev/random depletion
-
-SSL communications and the PKI/SSH authentication mechanisms employed by GHIDRA make use of the Java SecureRandom
-class to generate random numbers required by various cryptographic techniques. On Linux
-systems this class makes use of /dev/random to produce these random numbers which in turn
-relies on other system entropy sources to feed it. We have seen that /dev/random can
-become depleted which can cause the dependent Java application to hang. While Java claims
-to have settings which should allow /dev/urandom to be used, these security settings do
-not appear to work as intended. The best workaround we have found for systems which exhibit
-this problem is to install haveged (HArdware Volatile Entropy Gathering and
-Expansion Daemon) which will satisfy the entropy demand needed by /dev/random.
-
-
-
-macOS - Service fails to start (macOS 10.14 Mojave and later)
-
-The installed service may fail to start with macOS Mojave (10.14) and later due
-to changes in the Mac OS system protection feature. When the service fails to start it does not
-provide any error or logging to help determine the cause. Although granting Full Disk Access
-to Java can be a workaround, this is rather drastic and is not considered desirable
-since it will allow any Java application to run as root. For this reason, installation
-of the Ghidra Server as a service on macOS is discouraged.
-
-
-(Back to Top)
-
-
-
-
diff --git a/Ghidra/RuntimeScripts/Common/server/svrREADME.md b/Ghidra/RuntimeScripts/Common/server/svrREADME.md
new file mode 100644
index 0000000000..bc670b7d65
--- /dev/null
+++ b/Ghidra/RuntimeScripts/Common/server/svrREADME.md
@@ -0,0 +1,845 @@
+# Ghidra Server README
+
+## Table of Contents
+* [Introduction](#introduction)
+* [Java Runtime Environment](#java-runtime-environment)
+* [Server Configuration](#server-configuration)
+* [Server Logs](#server-logs)
+* [Server Memory Considerations](#server-memory-considerations)
+* [Note regarding use of DNS (name lookup service)](#note-regarding-use-of-dns-name-lookup-service)
+* [User Authentication](#user-authentication)
+* [SSH User Authentication](#ssh-user-authentication)
+* [Server Options](#server-options)
+* [Running Ghidra Server on Microsoft Windows](#running-ghidra-server-on-microsoft-windows)
+ * [Server Scripts](#server-scripts-located-within-the-server-subdirectory)
+ * [Running Server in Console Window](#running-server-in-console-window-intended-for-diagnostic-use-only)
+ * [Install as Automatic Service](#install-as-automatic-service-must-have-administrator-privilege)
+ * [Uninstall Service](#uninstall-service-must-have-administrator-privilege)
+* [Running Ghidra Server on Linux or macOS](#running-ghidra-server-on-linux-or-macos)
+ * [Server Scripts](#server-scripts-located-within-the-server-subdirectory-1)
+ * [Running Server in Console Window](#running-server-in-console-window)
+ * [Install as Automatic Service](#install-as-automatic-service-must-have-admin-privilege)
+ * [Uninstall Service](#uninstall-service-must-have-admin-privilege)
+* [Server Administration](#server-administration)
+* [Repository Backup](#repository-backup)
+* [Clearing Obsolete Checkouts](#clearing-obsolete-checkouts)
+* [PKI Certificates](#pki-certificates)
+* [Managing PKI Certificate Authorities](#managing-pki-certificate-authorities)
+* [Upgrading the Ghidra Server Installation](#upgrading-the-ghidra-server-installation)
+* [Troubleshooting / Known Issues](#troubleshooting--known-issues)
+ * [Failures Creating Repository Folders / Checking in Files](#failures-creating-repository-folders--checking-in-files)
+ * [Client/Server connection errors](#clientserver-connection-errors)
+ * [MS Windows - ERROR Incorrect function (WindowsWatchService)](#ms-windows---error-incorrect-function-windowswatchservice)
+ * [MS Windows - ERROR Missing Temp Directory](#ms-windows---error-missing-temp-directory)
+ * [MS Windows 7 and 8 - ghidraSvr.bat, svrInstall.bat, or svrUninstall.bat Error](#ms-windows-7-and-8---ghidrasvrbat-svrinstallbat-or-svruninstallbat-error)
+ * [Linux - SELinux must be disabled](#linux---selinux-must-be-disabled)
+ * [Linux - Potential hang from /dev/random depletion](#linux---potential-hang-from-devrandom-depletion)
+ * [macOS - Service fails to start](#macos---service-fails-to-start-macos-1014-mojave-and-later)
+
+## Introduction
+The Ghidra Server is incorporated into the standard Ghidra software distribution. Simply unpack the
+Ghidra distribution, configure the Ghidra Server and perform the OS-specific install and you should
+have the server running in no time.
+
+The Ghidra Server utilizes the YAJSW Java service wrapper to launch the application and provides OS
+specific scripts which enable the application to run as a service.
+
+__NOTE__: It is very important that only a single server instance is running against any given
+server repositories directory. This can be assured if only the default port is ever used.
+The daemon/service mechanism assumes that only one instance of the service exists. Attempting to
+run a second concurrent instance may lead to difficulties and is not supported.
+
+__NOTE__: It is highly recommended that the installation files for Ghidra reside on a local drive
+and that the intended Ghidra Server process owner is granted full access to the Ghidra installation
+directory (this is frequently not the case for NFS/SMB mounted home directories).
+
+You may also refer to the _InstallationGuide.html_ file within the _docs/_ subdirectory for general
+installation information.
+
+([Back to Top][top])
+
+## Java Runtime Environment
+The installation of a suitable Java Runtime Environment must be completed before installing or
+running the Ghidra Server. Please refer to the Ghidra Installation Guide to identify
+a suitable version. Since the Ghidra Server is unable to interactively identify a Java installation
+at runtime it must rely upon the setting of `JAVA_HOME`, execution search PATH or the use of
+standard Java installation locations. It is important to consider the service execution environment
+which may differ from the administrator who may be installing the service. For this reason use of
+an installed Java release may be preferable over one that is simply unpacked to an arbitrary
+location.
+
+([Back to Top][top])
+
+## Server Configuration
+Before installing and running the Ghidra Server, the `server/server.conf` file must be modified to
+suit your particular needs. Within this file, locate the lines labeled:
+```
+wrapper.app.parameter.#
+```
+These lines correspond to a sequential list of server command line arguments - be sure not duplicate
+a parameter number. The comments within this file indicate the available command line arguments
+which should be specified here based upon the desired user authentication, repositories directory
+location and other associated options.
+
+It is highly recommended that you specify a repositories directory outside of your Ghidra
+installation directory with an absolute path so that it may be re-used more easily with future
+upgraded installations of Ghidra. Due to the use of a filesystem watcher service the use of a
+locally attached storage device is preferred and will also ensure the best performance.
+
+__NOTE__: The server may fail to start if the repository native filesystem does not support the use
+of a filesystem watcher service. This could occur if attempting to use a remotely-mounted
+filesystem which may lack the required event support. The watcher service is used in conjunction
+with command processing associated with the `svrAdmin` command. If a running server fails to
+process queued `svrAdmin` command requests, the repository native filesystem may be the cause.
+
+When upgrading your Ghidra installation, you will need to copy your app parameters from your old
+_server.conf_ to the new _server.conf_. Do not copy the entire _server.conf_ file as this may
+prevent the server from running properly. If running as a service, you must run the
+`server/svrUninstall` script from the old installation before running the `server/svrInstall` script
+from the new installation. Using a non-default repositories directory outside your Ghidra
+installation will simplify the migration process.
+
+([Back to Top][top])
+
+## Server Logs
+The Ghidra Server produces two log files, which for the most part have the same content. The service
+_wrapper.log_ file generally resides within the Ghidra installation root directory, while the
+_server.log_ file resides within the configured _repositories/_ directory. When running the server
+in console mode all _wrapper.log_ output is directed to the console.
+
+([Back to Top][top])
+
+## Server Memory Considerations
+The Ghidra Server currently maintains an in-memory state for all repositories. We are aware that
+this can limit the scalability of the Ghidra Server. The maximum memory used by the process can be
+set within the `server/server.conf` file by adjusting the following setting:
+```
+wrapper.java.maxmemory
+```
+__WARNING__! There are currently no safeguards when insufficient memory is available to the Ghidra
+Server and can cause severe failure if an out of memory error occurs.
+
+The following formula can be used to approximate an appropriate setting for this `maxmemory` value
+where `FileCount` represents the maximum number of repository files and `ClientCount` is the number
+of active Ghidra clients connected at one time.
+```
+wrapper.java.maxmemory = 16 + (32 * FileCount/10000) + (2 * ClientCount)
+```
+Example:
+```
+100,000 files and 25 connected Ghidra clients
+16 + (32 * 100000/10000) + (2 * 25) = 386
+wrapper.java.maxmemory=772 (2 * 386, see NOTE below)
+```
+__NOTE__: Due to the dynamic memory demands on the server not considered by this calculation (e.g.,
+open file handles, etc.), the actual `maxmemory` setting used should be larger than the calculated
+value. At a minimum, it is recommended that the calculated value be doubled, and a larger value
+may be appropriate based upon server loading.
+
+The Java VisualVM tool (if available for your host) may also be used to examine memory usage while
+the server is running. This tool is NOT provided with any Ghidra distribution.
+
+([Back to Top][top])
+
+## Note regarding use of DNS (name lookup service)
+Both Ghidra Server and client application make extensive use of forward and reverse network name
+lookups. If this service is not properly configured on your network and hosts, names may fail to
+be resolved or in certain cases cause severe performance delays due to improperly serviced DNS
+name/address queries.
+
+By default the server will attempt to identify an appropriate remote access IPv4 address which will
+be written to the log at startup. In addition, the server will listen for incoming connections on
+all IPv4 interfaces by default. It is important to understand the difference between the published
+remote access address and the listening address (i.e. interface) which are both configurable. See
+the `-ip` and `-i` options in the [Server Options](#server-options) section for more details.
+
+([Back to Top][top])
+
+## User Authentication
+The Ghidra Server has been designed to support many possible user authentication modes:
+* __No authentication__: Any user which has been added to the server may connect without password or
+ credentials.
+
+* __Local Ghidra password (-a0)__: Passwords associated with each user added to the server are
+ maintained in the _users_ file located within the repositories directory. The user will be
+ prompted for this password when connecting to the server. The default password _changeme_ is used
+ when a user is first added or when the user is reset (see
+ [Server Administration](#server-administration)). This default password must be changed by the
+ user to avoid its expiration.
+
+* __Active Directory via Kerberos (-a1)__: User authentication is performed against your local
+ Active Directory system using Kerberos to do so. The `-d` argument is required to
+ specify the domain name of your Active Directory system.
+
+ It is also possible to authenticate against your Active Directory system using LDAP. See the LDAP
+ example when using JAAS -a4 mode.
+
+* __PKI authentication (-a2)__: User authentication is performed using PKI user certificates. When
+ using this mode, the distinguished name (DN) for each user must be associated with each server
+ User ID (see [Server Administration](#server-administration)). In addition, each user must
+ configure Ghidra with the location of their signing key/certificate keystore file (see
+ [PKI Certificates](#pki-certificates) for more information).
+
+ Please note that each user's certificate must be issued by a trusted certificate authority which
+ has been properly added to the Ghidra Server's _cacerts_ file. See
+ [Managing PKI Certificate Authorities](#managing-pki-certificate-authorities) for more
+ information.
+
+ In an attempt to simplify the determination of user DN's, a log file (_UnknownDN.log_) records
+ user DNs which are unknown. After adding a user to the server, ask the user to attempt a login
+ using their PKCS certificate. This should result in their DN being recorded to this log file. The
+ server administrator may now copy the appropriate DN from this log file when assigning the DN for
+ a user.
+
+* __JAAS - Java Authentication and Authorization Service (-a4)__: User authentication is delegated
+ to the JAAS subsystem. The -jaas `` argument is required to specify the JAAS config
+ file. The JAAS config file supplied (_server/jaas.conf_) contains various example configurations
+ which may be used to establish an 'auth' configuration section. None of the example
+ configurations use the 'auth' name so they will be ignored by default.
+
+ JAAS is architected similar to Linux/Unix PAM, where a named authentication configuration is
+ possibly composed of several different modules. Ghidra's support of JAAS only handles single
+ simple JAAS modules that requests the name and password from the user.
+
+ Some known JAAS login modules:
+ * __com.sun.security.auth.module.LdapLoginModule__: Allows authentication to an LDAP server. There
+ is an example of using this module to authenticate against an Active Directory system in the
+ jaas.conf file.
+
+ * __net.sf.jpam.jaas.JpamLoginModule (Linux/Unix server only)__: Allows authentication against
+ the local PAM configuration. You will need to download JPAM from SourceForce and install the
+ libraries in the necessary locations. See the example in the _jaas.conf_ file.
+
+ * __ghidra.server.security.loginmodule.ExternalProgramLoginModule__: Spawns an external program
+ for each authentication request, and uses the external program's exit code as the indicator
+ of successful authentication.
+
+ There is an example (and non-useful) implementation of an external authenticator provided with
+ the Ghidra installation called _server/jaas_external_program.example.sh_.
+
+ This login module strives to be compatible with Apache's mod_authnz_external API, and you should
+ be able to use any mod_authnz_external authenticator with Ghidra.
+
+ The external program is fed the username\n and password\n on its STDIN (i.e., two text lines).
+ The external authenticator needs to exit with 0 (zero) error level if the authentication was
+ successful, or a non-zero error level if not successful.
+
+ * __com.sun.security.auth.module.Krb5LoginModule__: Not recommended. This login module is used in
+ the `-a1` Active Directory via Kerberos authentication mode, and as such you should use it that
+ way.
+
+* __Use of an SSH pre-shared key (-ssh)__: Supported as an alternate form of authentication when
+ using Local Ghidra password (`-a0`). This SSH authentication is currently supported by the
+ Headless Analyzer only. See [SSH User Authentication](#ssh-user-authentication) for configuration
+ details.
+
+([Back to Top][top])
+
+## SSH User Authentication
+When the `-ssh` option has been included in conjunction with password based authentications mode
+(`-a0`) a user's SSH public key may be added to the server to facilitate access by a Headless
+Analyzer. An SSH public key file must be added to the server repository for each user who requires
+headless SSH authentication. The SSH public key file (e.g., _id_rsa.pub_) must be copied to the
+_repositories/~ssh/_ subdirectory to a file named `.pub`. Removing the file will
+eliminate SSH based authentication for the corresponding user. When creating the _~ssh/_
+subdirectory, it should be owned by the Ghidra Server process owner with full access and any SSH
+public keys readable by the process owner. Changes to the SSH public key files may be made without
+restarting the Ghidra Server.
+
+Each user may generate a suitable SSH key pair with the `ssh-keygen` command issued from a shell
+prompt. A PEM formatted RSA key-pair should be generated using the following command options:
+```
+ssh-keygen -m pem -t rsa -b 2048
+```
+__NOTE__: Ghidra Server authentication does not currently support the OPENSSH key format which may
+be the default _ssh-keygen_ format (`-m` option) on some systems such as Ubuntu. In addition, other
+key types (`-t` option) such as _ecdsa_ and _ed25519_ are not currently supported.
+
+([Back to Top][top])
+
+## Server Options
+
+### Networking options
+
+#### `-ip `
+Identifies the remote access hostname (FQDN) or IPv4 address which should be used by remote clients
+to access the server. By default the host name reported by the operating system is resolved to an
+IPv4 address, if this fails the local loopback address is used. The server log will indicate the
+remote access hostname at startup. This option may be required when a server has multiple IP
+interfaces, relies on a dynamic DNS or other network address translation for incoming connections.
+This option establishes the property value for _java.rmi.server.hostname_.
+
+#### `-i <#.#.#.#>`
+Forces the server to be bound to a specific IPv4 interface on the server. If specified and the `-ip`
+option is not, the address specified by `-i` will establish the remote access IP address as well as
+restrict the listening interface. If this option is not specified connections will be accepted on
+any interface.
+
+#### `-p#`
+Allows the base TCP port to be specified (default: 13100). The server utilizes three (3) TCP ports
+starting with the specified base port (e.g., 13100, 13101 and 13102). The ports utilized are logged
+by the server during startup.
+
+#### `-n`
+Enables reverse name lookup for IP addresses when logging (requires proper configuration of reverse
+lookup by your DNS server). Please note that logging of host names is now disabled by default due
+to the slow-down which occurs when reverse DNS is not properly configured on the network.
+
+### Authentication options
+
+#### `-a#`
+Allows a user authentication mode to be specified (see [User Authentication](#user-authentication))
+
+#### `-d`
+Sets the Active Directory domain name. Example: "-dmydomain.com"
+
+#### `-e#`
+Allows the reset password expiration to be set to a specified number of days (default is 1-day). A
+value of 0 prevents expiration.
+
+#### `-jaas `
+Specifies the path to the JAAS config file (when using `-a4`), relative to the ghidra/server
+directory (if not absolute).
+
+See _jaas.conf_ for examples and suggestions. It is the system administrator's responsibility to
+craft their own JAAS configuration directive when using the `-a4` mode.
+
+#### `-u`
+Allows the server login user ID to be specified at time of login for `-a0` authentication mode.
+Without this option, the users client-side login ID will be assumed.
+
+#### `-autoProvision`
+Enable the auto-creation of new Ghidra Server users when they successfully authenticate to the
+server (`-a1` and `-a4` modes only). Users removed from the authentication provider (e.g., Active
+Directory) will need to be deleted manually from the Ghidra Server using `svrAdmin` command.
+
+#### `-anonymous`
+Enable anonymous access support for Ghidra Server and its repositories. Only those repositories
+which specifically enable anonymous access will be accessible as read-only to an anonymous user.
+
+#### `-ssh`
+Enable SSH as an alternate form of authentication when using `-a0` authentication mode.
+
+([Back to Top][top])
+
+## Running Ghidra Server on Microsoft Windows
+
+### Server Scripts (located within the server subdirectory)
+* __svrInstall.bat__: Installs server as service (_ghidraSvr_)
+* __svrUninstall.bat__: Removes previously installed server service
+* __svrAdmin.bat__: Facilitates Ghidra Server administrative commands (see
+ [Server Administration](#server-administration))
+* __ghidraSvr.bat__: Provides a variety of commands for controlling the server when running as a
+ daemon process. When running this script it accepts a single argument which is one of the
+ following commands. Many of these commands are included so that this script may be used for
+ controlling the service.
+ * __console__: Starts server within the current terminal window. The _console_ argument may be
+ omitted to allow for double-click execution in this mode.
+ * __start__: Starts the previously installed Ghidra Server service
+ * __stop__: Stops the installed Ghidra Server service which is currently running
+ * __restart__: Stops and restarts the previously installed Ghidra Server service
+ * __status__: Displays the current status of the Ghidra Server (_ghidraSvr_) service
+
+__NOTE__: The above scripts may be run from a _CMD_ window, or by double-clicking the script file
+from an Explorer window. Other than the console and status operation, elevated privilege is needed
+to run these commands. As such the user executing these scripts must be a member of the
+Administrator group and must be run with elevated privilege. If using Windows Vista or newer, the
+best way to accomplish this is to run the _CMD_ shell using the _Run as Administrator_ action which
+is available by right-clicking on a command shortcut or batch file. If the _CMD_ shell is run in
+this manner, the Ghidra Server scripts may then be executed within the shell to run with
+administrator privilege.
+
+### Running Server in Console Window (intended for diagnostic use only)
+__NOTE__: Starting the server in console mode is generally intended for diagnostic use only.
+Extreme care must be taken to ensure that any user who starts the Ghidra Server via this script
+has full access to all directories and files within the root repository directory.
+
+If the Ghidra Server is not already running, it may be started within a console window by running
+the `ghidraSvr.bat console` command. When you wish to terminate the server, use the
+`Ctrl-C` key sequence within the server console window and wait for a clean shutdown.
+
+### Install as Automatic Service (must have Administrator privilege)
+The Ghidra Server may be installed as an automatic service by executing the _svrInstall.bat_ script.
+This script may be run from a _CMD window, or by double-clicking the script file from an Explorer
+window. Once installed, the server will start automatically when the system is booted. Immediately
+after running this script the service will not be running, you will need to either reboot or start
+the service from the Service Control Panel.
+
+### Uninstall Service (must have Administrator privilege)
+If after installing the Ghidra Server as a service you wish to uninstall it, you may run the
+_svrUninstall.bat_ script. You must stop the service via the Service Control Panel prior to running
+this script. This script may be run from a _CMD_ window, or by double-clicking the script file from
+
+__NOTE__: It is very important that you uninstall the service prior to doing any of the following
+activities:
+* Deleting or upgrading the Ghidra installation
+* Moving/renaming the Ghidra installation directory
+
+([Back to Top][top])
+
+## Running Ghidra Server on Linux or macOS
+
+__NOTE__: macOS has limited support (see
+[macOS - Service fails to start](#macos---service-fails-to-start-macos-1014-mojave-and-later)).
+
+### Server Scripts (located within the server subdirectory)
+* __svrInstall__: Installs server as service (_ghidraSvr_ or _wrapper.ghidraSvr_)
+* __svrUninstall__: Removes previously installed server service
+* __svrAdmin__: Facilitates Ghidra Server administrative commands (see
+ [Server Administration](#server-administration))
+* __ghidraSvr__: Provides a variety of commands for controlling the server when running as a
+ daemon process. When running this script it accepts a single argument which is one of the
+ following commands. Many of these commands are included so that this script may be used for
+ controlling the service.
+ * __console__: Starts server within the current terminal window
+ * __start__: Starts the previously installed Ghidra Server service
+ * __stop__: Stops the installed Ghidra Server service which is currently running
+ * __restart__: Stops and restarts the previously installed Ghidra Server service
+ * __status__: Displays the current status of the Ghidra Server (_ghidraSvr_) service
+
+### Running Server in Console Window
+__NOTE__: Starting the server in console mode is generally intended for diagnostic use only. Care
+must be taken to ensure that any user who starts the Ghidra Server via this script has full access
+to all directories and files within the root repository directory.
+
+If the Ghidra Server is not already running, it may be started within a terminal window by running
+the command: `ghidraSvr console`. When you wish to terminate the server, use the `Ctrl-C` key
+sequence within the server console window and wait for a clean shutdown.
+
+### Install as Automatic Service (must have admin privilege)
+The Ghidra Server may be installed as an automatic service by executing the _svrInstall_ script.
+Once installed, the server will start automatically when the system is booted. If performing an
+upgrade to an existing Ghidra Server installation you must uninstall the existing Ghidra Server
+first (see [Uninstall Service](#uninstall-service-must-have-admin-privilege)).
+
+In order for the installed service script to survive Java system updates, which may change the
+installed Java version, it is highly recommended that the `GHIDRA_JAVA_HOME` variable be set
+properly at the top of the `ghidraSvr` script prior to the server install. `GHIDRA_JAVA_HOME` should
+refer to a non-changing path where Java is installed. For a system-installed Java the major-version
+symblic-link path should be specified in favor of a full-version path which stipulates minor-version
+information. In addition, it is important that the Ghidra Server service be restarted anytime the
+installed Java version is updated where this symbolic link has been modified to reference a newly
+installed Java version. Failure to use this approach may result in the Ghidra Server service script
+referring to an invalid Java path following an update.
+
+Example setting of `GHIDRA_JAVA_HOME` within _ghidraSvr_ script:
+```
+GHIDRA_JAVA_HOME=/usr/lib/jvm/java-21-openjdk
+```
+If it is preferred to run the service with a dedicated local user account, the following entry may
+be added to the _server.conf_ file with the appropriate account specified in place of ``.
+A dedicated local service account should generally be a no-login account with a corresponding group
+identifier with the same name (i.e., see _/etc/passwd_ and _/etc/group_). The local account should
+be established and specified with server.conf prior to installation of the Ghidra Server service.
+```
+wrapper.app.account=
+```
+It is also important that the repositories directory and Ghidra installation files be owned by the
+service account with proper permissions. Note that while the Ghidra Server Java process will run
+using the specified _uid_, the _wrapper_ process will continue to run as _root_ and monitor/manage
+the Java process.
+
+### Uninstall Service (must have admin privilege)
+If after installing the Ghidra Server as a service you wish to uninstall it, you may run the
+_svrUninstall_ script.
+
+__IMPORTANT__: It is very important that you uninstall the Ghidra Server service using the original
+Ghidra software installation. Use of a newer Ghidra software install may not properly uninstall a
+different service version. This is particularly true if uninstalling a Ghidra Server version prior
+to 11.2. Such an uninstall will be required when:
+* deleting or upgrading the Ghidra installation
+* moving/renaming the Ghidra installation directory
+
+__NOTE__: The service control mechanism for Linux changed with the Ghidra 11.2 release. The
+_init.d_ mechanism was previously used in all cases, whereas the _systemd_ service mechanism may now
+used based upon YAJSW preference.
+
+([Back to Top][top])
+
+## Server Administration
+The script _svrAdmin_, or _svrAdmin.bat_, provides the ability to manage Ghidra Server users and
+repositories. This script must be run from a command shell so that the proper command line
+arguments may be specified. This command should only be used after the corresponding Ghidra
+installation has been properly configured via modification of the _server/server.conf_ file
+(see [Server Configuration](#server-configuration)) and installed and/or started.
+
+Many of the commands are queued for subsequent execution by the Ghidra Server process. Due to this
+queuing, there may be a delay between the invocation of a _svrAdmin_ command and its desired affect.
+The Ghidra log file(s) may be examined for feedback on queued command execution (see
+[Server Logs](#server-logs)).
+
+The general command usage is:
+```bash
+svrAdmin []
+ [-add [--p]]
+ [-grant <"+r"|"+w"|"+a"> ]
+ [-revoke ]
+ [-remove ]
+ [-reset [--p]]
+ [-dn ""]
+ [-list [...]]
+ [-list [--users]]
+ [-users]
+ [-migrate-all]
+ [-migrate ""]
+```
+
+#### ``
+There is normally no need to specify this argument on the command line.The default server-root-path
+is determined by the _server.conf_ setting of the `ghidra.repositories.dir` variable. This allows
+both the server execution and _svrAdmin_ script to utilize the same setting.
+
+#### `-add` (Adding a User)
+All authentication modes require that a user first be added to the server for a connection to be
+permitted. If Ghidra password authentication is used (`-a0`), the initial password is set to
+"__changeme__". This password must be changed by the user within 24-hours to avoid its expiration
+(password expiration period can be extended as a server option, see `-e`
+[server option](#server-options). Alternatively, the initial password may be specified by including
+the optional `--p` parameter which will prompt for an initial password.
+
+Examples:
+```bash
+svrAdmin -add mySID
+svrAdmin -add mySID --p
+```
+
+#### `-grant` (Grant Repository Access for User)
+Grant access for a specified user and repository where both must be known to the server. Repository
+access permission must be specified as +r for READ_ONLY, +w for WRITE or +a for ADMIN.
+
+Examples:
+```bash
+svrAdmin -grant mySID +a myRepo
+svrAdmin -grant mySID +w myRepo
+```
+
+#### `-revoke` (Revoke Repository Access for User)
+Revoke the access for a specified user and named repository. Currently, revoking access for a user
+does not disconnect them if currently connected.
+
+Examples:
+```bash
+svrAdmin -revoke mySID myRepo
+```
+
+#### `-remove` (Removing a User)
+A user may be removed from the Ghidra Server and all repositories with this command form. This will
+only prevent the specified user from connecting to the server in the future and will have no effect
+on the state or history of repository files. If a repository admin wishes to clear a user's
+checkouts, this is a separate task which may be performed from an admin's Ghidra client. Currently,
+removing a user does not disconnect them if currently connected.
+
+Example:
+```bash
+svrAdmin -remove mySID
+```
+
+#### `-reset` (Reset User's Ghidra Password)
+If a user's password has expired, or has simply been forgotten, the password may be reset to
+"__changeme__". After resetting, this password must be changed by the user within 24-hours to avoid
+its expiration (password expiration period can be extended as a server option). Alternatively, the
+new password may be specified by including the optional `--p` parameter which will prompt for an
+initial password.
+
+Example:
+```bash
+svrAdmin -reset mySID
+svrAdmin -reset mySID --p
+```
+
+#### `-dn` (Assign User's Distinguished Name)
+The use of PKI authentication requires that each user's DN be associated with their user SID.
+
+Example:
+```bash
+svrAdmin -dn mySID "CN=MyName,OU=AGENCY,OU=DoD,O=U.S. Government,C=US"
+```
+__NOTE__: After having been added to the server, a user's DN may be copied from the _UnknownDN.log_
+file following an attempted connection with their PKCS certificate.
+
+#### `-list` (List All Repositories and/or User Permissions)
+If the `--users` option is also present, the complete user access list will be included for each
+repository. Otherwise, command may be followed by one or user SIDs (separated by a space) which will
+limit the displayed repository list and access permissions to those users specified.
+
+Example:
+```bash
+svrAdmin -list
+svrAdmin -list --users
+svrAdmin -list mySID
+```
+
+#### `-users` (List All Users)
+Lists all users with server access.
+
+Example:
+```bash
+svrAdmin -users
+```
+
+#### `-migrate-all` (Migrate All Repositories to Use Indexed File-System Storage)
+For all repositories which are using the deprecated Mangled Filesystem storage, they will be
+marked for migration to the Indexed Filesystem storage with support for longer file pathnames.
+The actual migration will be performed when the Ghidra Server is restarted.
+
+Please note that any migration to the Indexed filesystem storage is a one-way conversion so a
+backup of your server repositories directory is highly recommended before proceeding.
+
+Example:
+```bash
+svrAdmin -migrate-all
+```
+
+#### `-migrate` (Migrate a Specified Repository to use Indexed File-System Storage)
+The specified repository will be marked for migration to the Indexed Filesystem storage with support
+for longer file pathnames. The actual migration will be performed when the Ghidra Server is
+restarted.
+
+Please note that any migration to the Indexed filesystem storage is a one-way conversion so a backup
+of your server repositories directory is highly recommended before proceeding.
+
+Example:
+```bash
+svrAdmin -migrate "myProject"
+```
+
+([Back to Top][top])
+
+## Repository Backup
+As with any server, it is highly recommended that your server repositories directory be periodically
+backed-up or whenever an upgrade (or data migration) is performed. While backups may be taken while
+the Ghidra Server is idle (e.g., after midnight), it is always safest to stop the Ghidra Server
+while a backup is in progress.
+
+([Back to Top][top])
+
+## Clearing Obsolete Checkouts
+Any user who has Admin privilege of a specific repository may use the Ghidra client to View
+Checkouts for a specific file and Delete individual checkouts from those that are listed. The
+_View Checkouts_ action is available from the popup-menu of the Ghidra Project Window by
+right-clicking on a specific project file.
+
+Under special circumstances (e.g., classroom environment) it may be desirable to remove all
+checkouts either for a specific repository or an entire Ghidra Server. Under Linux/Mac this is
+most easily accomplished from the command shell while the Ghidra Server is stopped. The following
+command may be used:
+
+```bash
+find -name checkout.dat -exec rm {} \;
+```
+
+where `` is the directory path of a specific named repository root, or the parent
+repositories directory if clearing checkouts for all repositories.
+
+__WARNING!__ Since the `find` command is recursive, care must be taken when specifying the
+`` and the other parameters. If you specify the incorrect `` or omit the
+correct `-name` argument, you may remove important files without the ability to recover.
+
+([Back to Top][top])
+
+## PKI Certificates
+PKI keys/certificates can be used to authenticate clients and/or servers. When using the Ghidra
+Server PKI authentication mode this corresponds to "client authentication" which requires the
+_server.conf_ to specify a _cacerts_ file location and each user client to configure a user signing
+key/certificate keystore file. If clients wish to authenticate the server, the _server.conf_ must
+specify a server key/certificate keystore file and each user client must configure a _cacerts_ file.
+See [Managing PKI Certificate Authorities](#managing-pki-certificate-authorities) for more
+information on configuring a _cacerts_ file.
+
+User and server certificates must be acquired through one of many trusted authorities identified by
+the _cacerts_ file installed by the peer system. Your network support staff should be able to help
+you acquire a suitable signing key/certificate in the form of either a _*.p12_, _*.pks_, or _*.pfx_
+file.
+
+User's of the Ghidra GUI application can install their key/certificate file via the project window
+menu item _Edit->Set PKI Certificate..._. The user will be prompted for their keystore password the
+first time key access is required for a network connection after starting the application. If using
+the _analyzeHeadless_ script, see the _analyzeHeadlessREADME.html_ file for details.
+
+If the Ghidra Server will be installing a server certificate, the _server.conf_ file should be
+modified to properly identify the server's key/certificate location (_ghidra.keystore_) and password
+(_ghidra.password_).
+
+([Back to Top][top])
+
+## Managing PKI Certificate Authorities
+When utilizing PKI authentication for a Ghidra Server a set of certificates for trusted Certificate
+Authorities (CA) must be collected and added to a cacerts keystore file created using the Java
+keytool. The Java keytool can be found within the Java Development Kit (JDK) provided with
+Ghidra (_java/bin/keytool_) or any other Java distribution. The default cacerts keystore file
+location is _Ghidra/cacerts_ and is also specified by the _ghidra.cacerts_ property setting within
+the _server.conf_ file. Uncomment this specification within the _server.conf_ file to activate use
+of the _cacerts_ for all incoming SSL/TLS connections (i.e., all Ghidra client users must install
+and employ the use of their personal PKI signing certificate for both headed and headless use - see
+[PKI Certificates](#pki-certificates)). Clients can also impose server authentication for all HTTPS
+and Ghidra Server connections by creating the _cacerts_ file and enabling the _ghidra.cacerts_
+property setting within the _support/launch.sh_ and/or _support/launch.bat_ scripts.
+
+Individual CA public key certificates should be obtained in a Base64 encoding (see sample below).
+If pasting the encoded certificate into a file, be sure to include an extra blank line after the
+`END CERTIFICATE` line.
+
+Sample Base64 encoded certificate:
+```
+-----BEGIN CERTIFICATE-----
+laSKCIElkjsudCUDusjSUkjeMSUjAJHDuLQWMCMausALkKXMXOOjSKSUjssjSKAA
+ksDSDjLKJHAuemCXXUmxxqjaskuDSYRmxiqgDlakkUSUdhemjASKUakjhuEhxMSD
+...
+ksJKDwocQwyeEIcbzHtyrSLfoeyGCmvbNLGHpgoruSTYQafzDFTgwjkJHCXVDjdg
+KDowiyYTXkcuiwCJXuyqCHpdoORriwwcCWUskucuwHDJskuejdkUWJCUDSjujsUE
+-----END CERTIFICATE-----
+```
+You can inspect the contents of a Base64 encoded certificate file with the following command:
+
+```bash
+keytool -printcert -v -file
+```
+where:
+* `` is the file containing the Base64 encoded CA certificate to be imported.
+
+The Owner common name (CN) displayed by this command should be used as the alias when importing the
+certificate into your cacerts file.
+
+The following command should be used to add a CA certificate to a new or existing cacerts file:
+
+```bash
+ keytool -import -alias "" -file -storetype jks -keystore
+```
+where:
+* `` is the name of the CA corresponding to the imported certificate.
+* `` is the file containing the Base64 encoded CA certificate to be imported.
+* `` is the cacerts file to be used by the Ghidra Server (and/or client if needed).
+
+The keystore password will be requested and is used to restrict future modifications to the
+_cacerts_ file.
+
+When starting the Ghidra Server with PKI authentication enabled, the CA certificates contained
+within the _cacerts_ file will be dumped to the log with their expiration dates.
+
+Please note that the Ghidra Server does not currently support Certificate Revocation Lists (CRLs).
+
+([Back to Top][top])
+
+## Upgrading the Ghidra Server Installation
+1. Be sure to backup your projects and tools to ensure that the new Ghidra installation does not
+ overwrite any of your data. Individual program files upgraded to a newer version of Ghidra
+ can not be opened with an older version.
+
+2. Uninstall an installed Ghidra Server Service by following the _Uninstall Service_ instructions
+ corresponding to your operating system
+ ([Windows](#uninstall-service-must-have-administrator-privilege) or
+ [Linux/macOS](#uninstall-service-must-have-admin-privilege)).
+
+3. Unzip the new Ghidra distribution to a new installation directory (general unpacking and
+ installation guidelines may be found in _ghidra_x.x/docs/InstallationGuide.html_).
+
+4. Copy the old _repositories_ directory to the new Ghidra Server installation directory.
+
+5. Copy the `wrapper.app.parameter.#` lines from your old _server/server.conf_ file to the new
+ installation _server/server.conf_. For 5.0 release and earlier, your old _server.conf_ file is
+ located within a platform-specific directory (`core/os/`). No other changes should be
+ made to your new _server.conf_ file.
+
+ __Do not replace the new server.conf file with your old server.conf file, as this could cause
+ server problems.__
+
+6. If desired, install the Ghidra Server Service from the new installation server subdirectory by
+ following the instructions corresponding to your operating system
+ ([Windows](#install-as-automatic-service-must-have-administrator-privilege) or
+ [Linux/macOS](#install-as-automatic-service-must-have-admin-privilege)).
+
+__WARNING!__ __As of Ghidra 7.0 a new project/server storage implementation, `Indexed-V1`, has been
+added which is not compatible with older versions of Ghidra.__ The _Indexed-V0_ filesystem storage
+allows longer filenames and paths to exist within a project, while the `V1` version expands support
+to facilitate some of the very large project/repository features introduced in Ghidra 7.0. Since the
+legacy storage implementation (_Mangled_) used by older projects and repositories is still
+supported, conflicting storage behavior may exist between a Ghidra project and its server repository
+for long filename/path support. It is highly recommended that all server repositories and associated
+projects be migrated to the new Indexed storage implementation in a coordinated fashion after making
+a complete backup. All new Ghidra projects will utilize the new Indexed storage implementation, so
+care should taken when creating shared projects with older repositories.
+
+__NOTE__: If using Ghidra 6.0.x, opening a project which uses the newer _Indexed-V1_ filesystem may
+cause the project storage to revert to the older _Indexed-V0_ filesystem.
+
+A user may determine which storage implementation is used by a project by viewing the _Project Info_
+display (via _Project -> View Project Info..._). Local projects using the legacy _Mangled_
+filesystem may be migrated to the new _Indexed_ filesystem via this _Project Info_ panel. The status
+of Ghidra Server repositories storage can be determined and flagged for migration via the
+_server/svrAdmin_ script (described in the [Server Administration](#server-administration) section).
+Please note that any migration to the _Indexed_ filesystem storage is a one-way conversion so a
+backup of your project or server repositories directory is highly recommended before proceeding.
+
+([Back to Top][top])
+
+## Troubleshooting / Known Issues
+
+### Failures Creating Repository Folders / Checking in Files
+If you see continuous failures to create repository folders or failures to check in files, check
+the disk space on the server or folder permissions. When the server runs out of disk space, it
+cannot create folders or check in files.
+
+### Client/Server connection errors
+The Ghidra Server has transitioned to using SSL/TLS connections when accessing the server's RMI
+registry. This change in communication protocol can cause unexpected symptoms when attempting to
+connect incompatible versions of Ghidra. When an older incompatible Ghidra client attempts to access a
+newer SSL/TLS enabled Ghidra Server registry, the following connection error will occur:
+```
+non-JRMP server at remote endpoint
+```
+
+### MS Windows - ERROR Incorrect function (WindowsWatchService)
+The Ghidra Server employs a file system watcher service for the repositories directory which must
+reside within a locally mounted NTFS or ReFS filesystem.
+
+### MS Windows - ERROR Missing Temp Directory
+Running the Ghidra Server as an installed service under Windows may attempt to use a non-existing
+temporary directory (e.g., `C:\Windows\system32\config\systemprofile\AppData\Local\Temp\`). The
+work-around for this is to configure the server to use an existing temporary directory (e.g.,
+`C:\Windows\Temp`). This can be done by editing the _server.conf_ file, locate the
+_wrapper.java.additional_ entries and add/uncomment an entry with your temporary directory
+specified. For example:
+```
+wrapper.java.additional.3=-Djava.io.tmpdir=C:\Windows\Temp
+```
+Be sure to use the next unique sequence number for your _wrapper.java.additional_ entry.
+
+### MS Windows 7 and 8 - ghidraSvr.bat, svrInstall.bat, or svrUninstall.bat Error
+The following error may occur when attempting to install/uninstall/start/stop/restart the Ghidra
+Server under MS Windows 7 or 8 even if the user is a member of the Administrator group:
+```
+Access denied: please check the user credentials
+```
+The user executing these scripts must be a member of the Administrator group and must be run with
+elevated privilege. The best way to accomplish this is to run the _CMD_ shell using the
+_Run as Administrator_ action which is available by right-clicking on a command shortcut or batch
+file. If the _CMD_ shell is run in this manner, the Ghidra Server scripts may then be executed
+within the shell to run with administrator privilege. Failure to run the scripts in this manner may
+cause failure information to be hidden from view due to the privilege escalation mechanism.
+
+### Linux - SELinux must be disabled
+The Ghidra Server may not start properly if SELinux has not been disabled. This setting is
+specified in the file _/etc/selinux/config_.
+
+### Linux - Potential hang from /dev/random depletion
+SSL communications and the PKI/SSH authentication mechanisms employed by GHIDRA make use of the Java
+`SecureRandom ` class to generate random numbers required by various cryptographic techniques. On
+Linux systems this class makes use of _/dev/random_ to produce these random numbers which in turn
+relies on other system entropy sources to feed it. We have seen that _/dev/random_ can become
+depleted which can cause the dependent Java application to hang. While Java claims to have settings
+which should allow _/dev/urandom_ to be used, these security settings do not appear to work as
+intended. The best workaround we have found for systems which exhibit this problem is to install
+_haveged_ (HArdware Volatile Entropy Gathering and Expansion Daemon) which will satisfy the entropy
+demand needed by _/dev/random_.
+
+### macOS - Service fails to start (macOS 10.14 Mojave and later)
+The installed service may fail to start with macOS Mojave (10.14) and later due to changes in the
+macOS system protection feature. When the service fails to start it does not provide any error or
+logging to help determine the cause. Although granting _Full Disk Access_ to _Java_ can be a
+workaround, this is rather drastic and is not considered desirable since it will allow any Java
+application to run as root. For this reason, installation of the Ghidra Server as a service on
+macOS is discouraged.
+
+([Back to Top][top])
+
+[top]: #ghidra-server-readme
\ No newline at end of file
diff --git a/Ghidra/RuntimeScripts/certification.manifest b/Ghidra/RuntimeScripts/certification.manifest
index 9831b1ceec..c50f377991 100644
--- a/Ghidra/RuntimeScripts/certification.manifest
+++ b/Ghidra/RuntimeScripts/certification.manifest
@@ -4,7 +4,7 @@
##MODULE IP: Public Domain
Common/server/jaas.conf||GHIDRA||||END|
Common/server/server.conf||GHIDRA||||END|
-Common/server/svrREADME.html||GHIDRA||||END|
+Common/server/svrREADME.md||GHIDRA||||END|
Common/support/GhidraGo/ghidraGoREADME.html||GHIDRA||||END|
Common/support/analyzeHeadlessREADME.md||GHIDRA||||END|
Common/support/buildGhidraJarREADME.txt||GHIDRA||||END|